跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 如何确定字符串显示的宽度
未分類
19 5 月 2020

如何确定字符串显示的宽度

如何确定字符串显示的宽度

資深大佬 : songdg 0

例如 a = ‘PM2.5’ b = ‘地下管道’ c = ‘空铁 WIFI’,a 、b 、c 的宽度分别为 5 、8 、8,字母、数字的宽度为 1,汉字的宽度为 2 。用 len 函数得到的结果为 5 、4 、6 ;用 sys.getsizeof 得到的结果为 54 、82 、86,当字符串中含有混合字符时也不能用来推导显示宽度。请教还有没有其他方法。

大佬有話說 (20)

  • 資深大佬 : codehz

    用 freetype 的 api 真实可以取得各种测量属性,当然,需要指定字体

  • 資深大佬 : xcstream

    用等宽字体 判断中英文

  • 資深大佬 : ClericPy

    暂时能想到的就只有正则出中文字数… len + len_中

  • 資深大佬 : secondwtq

    这么复杂的问题你确定能在中文社区问出答案来么……

  • 資深大佬 : 0x5f

    如果是获取显示在图片上的宽度话 pil 库里有个 ImageFont.getsize()可以返回渲染后文字长宽

  • 資深大佬 : JCZ2MkKb5S8ZX9pq

    我自己在用的是这个

    width = (len(string) + len(string.encode(‘utf-8’))) // 2 # py3

    前置还要移掉点 anis 之类的玩意儿,中日英目前用下来还好,日文小字也算 2 。
    但是类似西班牙语法语那种带小尾巴的,unicode 有种写法是尾巴单独用一个字符,那个也许会有问题。

  • 資深大佬 : JCZ2MkKb5S8ZX9pq

    @ClericPy
    看看我上面这个,利用了编码之后中文 1 变 3 的特性,平时主要处理中英文还好,看看会有什么问题吗?

    @songdg
    另外我想起来类似 preetrytable 之类的模块,好像中文宽度都给处理过了,有兴趣也可以直接看看人家源码。

  • 資深大佬 : lithbitren

    只看中英文和常用符号还好,加上其他语言符号是真 jb 复杂

  • 資深大佬 : JCZ2MkKb5S8ZX9pq

    另外我上面说的都是我在程序里打印结果,然是是等宽字体的情况下的占位数。
    如果是显示的话,要看显示在什么地方,以及用什么字体吧。lz 可以把问题再具体一点。
    图片的话上面提到 pil 可以,截屏去拿也是个办法。
    终端的话因为是等宽的,且行宽可测所以推测行数也是可以的。

  • 資深大佬 : justfortest

    这是个复杂的问题

  • 資深大佬 : jin7

    用 pyqt5/pyside2 就行了 很容易计算宽度

  • 資深大佬 : XIVN1987

    In [11]: s = ‘空铁 WIFI’

    In [12]: [ord(c) for c in s]
    Out[12]: [31354, 38081, 87, 73, 70, 73]

    In [13]: [1 if ord(c) < 0x80 else 2 for c in s]
    Out[13]: [2, 2, 1, 1, 1, 1]

    In [14]: sum([1 if ord(c) < 0x80 else 2 for c in s])
    Out[14]: 8

  • 資深大佬 : lithbitren

    全角和半角符号的编码范围不是连续的,一个比较符的实现可能还是有 bug 的。

  • 資深大佬 : Kisesy

    if unicodedata.east_asian_width(char) in (‘F’, ‘W’):
    width = width + 2
    else:
    width = width + 1

  • 資深大佬 : XiaoxiaoPu

    有个现成的库,用了很久了 wcwidth

  • 資深大佬 : aihimmel

    不要简单推定字符宽度
    “لا”
    上面这个是两个字符但是打印出来只有 1 的宽度,确定宽度最好还是渲染出来再取宽度

  • 主 資深大佬 : songdg

    @codehz 谢谢,有必要还是要试一下。

  • 主 資深大佬 : songdg

    @JCZ2MkKb5S8ZX9pq 谢谢,基本上解决了我的问题。

  • 主 資深大佬 : songdg

    @Kisesy 谢谢帮助。

  • 主 資深大佬 : songdg

    @XIVN1987 谢谢帮助。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具