日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python如何计算字符宽度_Python中计算字符宽度

發(fā)布時(shí)間:2023/12/31 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python如何计算字符宽度_Python中计算字符宽度 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載:http://likang.me/blog/2012/04/13/calculate-character-width-in-python/

最近在用python寫(xiě)一個(gè)CLI小程序,其中涉及到計(jì)算字符寬度,目標(biāo)是以友好的方式將一個(gè)長(zhǎng)字符串截取為等寬的片段。

對(duì)于unicode字符,python的len函數(shù)可以準(zhǔn)確的計(jì)算其中所包含的字符個(gè)數(shù),但是個(gè)數(shù)并不代表寬度,如:

>>>len(u'你好a')3

因此無(wú)法簡(jiǎn)單的使用這種方式來(lái)計(jì)算寬度。

GBK decode

首先我想到GBK編碼,00–7F范圍內(nèi)的字符是一字節(jié)編碼,其余是雙字節(jié)編碼,正好與字符的寬度大體一致,于是有了這樣的投機(jī)取巧的辦法(假設(shè)取8個(gè)寬度):

>>>a=u'hello你好'>>>b=a.encode('gbk')>>>try:...printb[:8].decode('gbk')...except:...printb[:7].decode('gbk')...hello你

如代碼所示,首先將unicode的字符串進(jìn)行GBK編碼,然后截取8個(gè)字節(jié)的寬度后嘗試用GBK解碼,若解碼失敗,則少截取一個(gè)寬度,截取7個(gè)字節(jié)后使用GBK解碼。

雖然初步解決了問(wèn)題,但是這樣做的硬傷很明顯。首先代碼不優(yōu)雅,以試錯(cuò)的方式運(yùn)行;其次GBK所能表示的字符有限,對(duì)于大量GBK編碼以外的字符無(wú)法支持。

East_Asian_Width

徘徊很久之后,偶然發(fā)現(xiàn) Unicode Character Database標(biāo)準(zhǔn)中有East_Asian_Width 屬性,并有以下可能值:

# East_Asian_Width (ea)ea;A;Ambiguous不確定ea;F;Fullwidth全寬ea;H;Halfwidth半寬ea;N;Neutral中性ea;Na;Narrow窄ea;W;Wide寬

其中除A不確定外,F/H/N/Na/W都能很明確的知道寬度,如果保守起見(jiàn),將A視為寬度為2的話,則很容易給出單個(gè)字符的寬度:

>>>importunicodedata>>>defchr_width(c):...if(unicodedata.east_asian_width(c)in('F','W','A')):...return2...else:...return1>>>chr_width(u'你')2>>>chr_width(u'a')1

到現(xiàn)在似乎已經(jīng)可以滿足要求了,但是實(shí)際使用中發(fā)現(xiàn)屬性為A的字符真不少見(jiàn),最典型的就是中文的雙引號(hào):

>>>chr_width(u'”')2

在大多數(shù)等寬字體中,中文雙引號(hào)都是只占一位寬的,如果一行里有多個(gè)中文雙引號(hào),則累加的誤判寬度將會(huì)使截取效果大打折扣,無(wú)疑這也不是最好的辦法。

urwid的解決方案

urwid是一個(gè)成熟的python終端UI庫(kù),它在curses的基礎(chǔ)之上包裝了類似HTML的控件用以顯示文本內(nèi)容,如果有這方面的開(kāi)發(fā)需求,非常推薦此庫(kù),比直接使用curses庫(kù)方便很多,非常棒的是它對(duì)unicode的文本寬度截取非常準(zhǔn)確,讓我大為驚訝,于是翻開(kāi)它的源碼一探究竟,文本寬度計(jì)算方面其核心代碼如下:

widths=[(126,1),(159,0),(687,1),(710,0),(711,1),(727,0),(733,1),(879,0),(1154,1),(1161,0),(4347,1),(4447,2),(7467,1),(7521,0),(8369,1),(8426,0),(9000,1),(9002,2),(11021,1),(12350,2),(12351,1),(12438,2),(12442,0),(19893,2),(19967,1),(55203,2),(63743,1),(64106,2),(65039,1),(65059,0),(65131,2),(65279,1),(65376,2),(65500,1),(65510,2),(120831,1),(262141,2),(1114109,1),]defget_width(o):"""Return the screen column width for unicode ordinal o."""globalwidthsifo==0xeoro==0xf:return0fornum,widinwidths:ifo<=num:returnwidreturn1

如代碼所示,首先根據(jù)unicode的官方EastAsianWidth文檔整理出字符寬度的范圍表,然后使用unicode代碼查表。使用之前的例子測(cè)試:

>>>get_width(ord(u'a'))1>>>get_width(ord(u'你'))2>>>get_width(ord(u'”'))1

完全準(zhǔn)確,而且在實(shí)際應(yīng)用中的表現(xiàn)也比較好,是一個(gè)理想的解決方案,更多技巧請(qǐng)查閱urwid的old_str_util.py源碼。

總結(jié)

以上是生活随笔為你收集整理的python如何计算字符宽度_Python中计算字符宽度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产伊人网 | 一区二区三区国产精品 | 制中文字幕音影 | 欧美日韩图片 | 福利色播| 少妇喷潮明星 | 国产99视频在线观看 | 日韩狠狠操 | 性调教学院高h学校 | 暗呦丨小u女国产精品 | www.久久网 | 亚洲精品一区二区三区四区乱码 | 日韩高清毛片 | 日日夜夜狠狠干 | 可以看的黄色网 | 伊人久久大香线蕉综合网站 | 无码人妻一区二区三区在线 | 日韩不卡视频在线观看 | 在线观看网站黄 | 国内精品视频在线播放 | 青青青免费在线视频 | 久久国产秒 | 亚洲久热 | wwwxx日本 | 国产一卡二卡在线播放 | 无码一区二区三区在线 | 婷婷九月 | 亚洲精品91天天久久人人 | 男女羞羞在线观看 | 亚洲国产网| 波多野结衣精品在线 | 国产黄网在线观看 | 黄色片www| 国产不卡一区二区视频 | 色秀视频在线观看 | 欧美二区三区 | 日韩欧美中文在线观看 | 欧美日韩精品综合 | 久久国产精品电影 | 狠狠干夜夜干 | 国产情趣视频 | 精品人妻伦一二三区久 | 5a毛片| 欧美群妇大交群 | 日本黄图 | 情涩快播| 精品一区二区三区中文字幕 | www.199麻豆| 性xxxx视频播放免费 | 玉丸(双性调教) | 日韩美女视频 | av色婷婷 | 亚洲欧美高清在线 | 欧美日韩在线视频免费播放 | 国产欧美综合视频 | 在线观看黄色大片 | 日本在线观看网站 | 一区二区三区四区免费 | 日本成片网 | 蜜桃91麻豆精品一二三区 | 黑人玩弄人妻一区二区三区影院 | 国产资源视频 | 日韩a在线播放 | 极品淫少妇 | 欧美亚洲成人网 | av黄色免费网站 | 无码人中文字幕 | 欧美淫视频 | 岛国精品在线播放 | 天天爱天天插 | 夜夜嗨国产| 91导航 | 激情片| 四色在线 | 最近中文字幕mv免费高清在线 | 国内老熟妇对白hdxxxx | 中国毛片视频 | 久章操| 久久视频网| 欧美一级做a爰片久久高潮 久热国产精品视频 | 屁股夹体温计调教play | 日本高清视频www夜色资源 | 69式视频| 日韩三级观看 | 香蕉视频三级 | 亚洲男女 | 国产精品无遮挡 | 日韩r级电影在线观看 | 免费在线观看小视频 | 91色视频在线观看 | 狠狠干2019| 操日本女人 | 亚洲综合网av | 国产精品免费看 | 日本精品黄色 | 香蕉视频在线看 | 国产一区二区三区播放 | 少妇久久精品 | 不用播放器的av网站 |