当前位置: 首页 > 面试题库 >

大致近似于Python中文本字符串的宽度?

赵晨
2023-03-14
问题内容

使用Python如何估计给定文本字符串的字体宽度?

我正在寻找一个类似原型的函数:

def getApproximateFontWidth(the_string, font_name="Arial", font_size=12):
   return ... picas or pixels or something similar ...

我并不是在寻找任何非常严格的东西,大概是可以的。

这样做的动机是我在Webapp的后端中生成了一个截断的字符串,并将其发送到要显示的前端。多数情况下,琴弦是小写字母,但有时琴弦都用大写字母,因此很宽。如果字符串未正确删节,则看起来很难看。我想知道根据字符串的大致宽度将字符串截断多少。如果偏差减少10%,这没什么大不了的,这是一项装饰性功能


问题答案:

以下是我的简单解决方案,可使您达到80%的精度,非常适合我的目的。它仅适用于Arial,并且假定使用12 pt字体,但也可能与其他字体成比例。

def getApproximateArialStringWidth(st):
    size = 0 # in milinches
    for s in st:
        if s in 'lij|\' ': size += 37
        elif s in '![]fI.,:;/\\t': size += 50
        elif s in '`-(){}r"': size += 60
        elif s in '*^zcsJkvxy': size += 85
        elif s in 'aebdhnopqug#$L+<>=?_~FZT' + string.digits: size += 95
        elif s in 'BSPEAKVXY&UwNRCHD': size += 112
        elif s in 'QGOMm%W@': size += 135
        else: size += 50
    return size * 6 / 1000.0 # Convert to picas

如果要截断字符串,则为:

def truncateToApproximateArialWidth(st, width):
    size = 0 # 1000 = 1 inch
    width = width * 1000 / 6 # Convert from picas to miliinches
    for i, s in enumerate(st):
        if s in 'lij|\' ': size += 37
        elif s in '![]fI.,:;/\\t': size += 50
        elif s in '`-(){}r"': size += 60
        elif s in '*^zcsJkvxy': size += 85
        elif s in 'aebdhnopqug#$L+<>=?_~FZT' + string.digits: size += 95
        elif s in 'BSPEAKVXY&UwNRCHD': size += 112
        elif s in 'QGOMm%W@': size += 135
        else: size += 50
        if size >= width:
            return st[:i+1]
    return st

然后是以下内容:

>> width = 15
>> print truncateToApproxArialWidth("the quick brown fox jumps over the lazy dog", width) 
the quick brown fox jumps over the
>> print truncateToApproxArialWidth("THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG", width) 
THE QUICK BROWN FOX JUMPS

呈现时,这些字符串的宽度大致相同:

快速的棕色狐狸跳过了

快速棕狐跳



 类似资料:
  • 问题内容: 使用像leveinstein(leveinstein或difflib)之类的算法,很容易找到近似匹配。 可以通过根据需要确定阈值来检测模糊匹配。 当前要求:基于较大字符串中的阈值来查找模糊子字符串。 例如。 一种蛮力解决方案是生成长度为N-1到N + 1(或其他匹配长度)的所有子串,其中N是query_string的长度,并在它们上逐个使用levenstein并查看阈值。 在pytho

  • 问题内容: 我需要python中的高性能字符串哈希函数,该函数可以生成至少具有 34 位输出的整数(64位是有意义的,但32位太少了)。在Stack Overflow上还有其他类似的问题,但是在我能找到的每一个被接受/赞成的答案中,我都属于以下几类之一,这些问题都不适用(由于给定的原因)。 使用内置功能。至少在我正在开发的机器上(使用python 2.7和64位cpu),此函数会产生一个整数,该整

  • 问题内容: 我在Python中有这样的字符串: 我该如何删除 从字符串的一部分? 问题答案: 您可以将其编码为并忽略错误: 输出:

  • 我正在开发一个应用程序,其中有大约8000个印度城市的名字。当用户输入时,我使用auto complete来帮助用户完成任务。但是有些城市名字的拼写对其他州的人来说是很难猜出来的。所以我们需要一个近似的字符串匹配来实现自动完成,而不是缺省情况下的精确匹配。 例如,有这样的名字 Thirumayilai Thirunettur Thiruthuraiyur Thiruvarur 而且还 Tirune

  • 问题内容: 我想让’==’运算符在我的程序中使用近似比较:如果x和y的浮点值相等(==) 有什么好的方法呢?鉴于float是内置类型,我认为我不能重新定义==运算符,可以吗? 请注意,我想使用float的其他功能,唯一要更改的是相等运算符。 编辑: 感谢您的回答,我了解您关于可读性和其他问题的观点。 也就是说,如果可能的话,我真的更希望实际上继续使用常规的float类型,而不是使用新的类或新的比较

  • 问题内容: 我有2个数据框,格式如下: 完整的df_search有15,000个项目。df_all有550,000个项目。我正在尝试基于文件字符串中的搜索项目字符串来合并两个数据框。我想要的输出是这样的: 简单的数据框合并不起作用,因为字符串永远不会完全匹配(它始终是子字符串)。我还根据其他关于stackoverflow的问题尝试了以下方法: 这给了我df_all中所有找到的项目的完整列表,但是我

  • 问题内容: 我已经在网上搜索了很多次,但找不到一种方法来转换我的二进制字符串变量 X 转换为UTF-8字符串值。 我发现有些人正在使用诸如 但是,此方法对我不起作用,因为据说不存在“ b”,并且我不确定如何用变量替换“消息”。不仅如此,我还无法理解这种方法的工作原理。有更好的选择吗? 那么如何将二进制字符串转换为文本字符串呢? 编辑:我也不介意ASCII解码 澄清:这就是我想发生的事情。 然后将产