日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美极品在线视频 | 亚洲 国产 欧美 日韩 | 天海翼视频在线观看 | 中文字幕第一页在线 | 成人小视频在线免费观看 | japanese24hdxxxx中文字幕 | 久久久全国免费视频 | 国产男男gay体育生网站 | 久久久久99精品成人片试看 | 天堂久久av | 午夜精品无码一区二区三区 | 午夜视频色 | 日本成人免费 | 色窝窝无码一区二区三区成人网站 | 久久久久久国产精品免费播放 | 国产一级视频在线观看 | 日本成人在线免费观看 | 亚洲免费影视 | 国产一区二区三区在线视频 | 中文字幕一区二区三区乱码在线 | 秋霞国产| 免费人成在线观看 | 麻豆视频免费在线 | 久操视频免费看 | 在线视频 亚洲 | 久久国产香蕉 | 国内视频一区二区 | 97黄色片 | 五月婷婷六月婷婷 | 亚洲日本视频在线观看 | 香蕉视频在线观看www | 中文在线字幕免费观看电 | 91插插插影库永久免费 | 成人视品| 亚洲午夜福利一区二区三区 | 国产亚洲美女精品久久久2020 | 精品一二三四 | 做爰视频毛片视频 | 日批av| 亚洲欧美一区二区三区情侣bbw | 精品日韩在线观看 | h网站免费在线观看 | 天堂综合网 | 免费久久视频 | 国产在线精品一区 | 国产福利视频在线观看 | 又黄又色又爽 | 亚洲 精品 综合 精品 自拍 | 久久婷婷色综合 | 日韩高清不卡一区 | 日韩国产精品视频 | 另类小说一区二区 | 欧美激情影音先锋 | 国产秋霞 | 中文欧美日韩 | 男人久久 | 两女双腿交缠激烈磨豆腐 | 成人欧美一区二区三区黑人孕妇 | 国产成人无码一区二区在线观看 | 国产免费一级片 | 国产3级 | 香蕉一级片 | 91成人免费在线 | 国产精品va无码一区二区三区 | 六月婷婷七月丁香 | 五月婷婷综合在线 | 72种无遮挡啪啪的姿势 | 深夜福利在线播放 | 嫩草一二三 | 超碰在线免费播放 | 国产精品自拍av | 亚洲综合一区在线观看 | 欧美三级视频在线观看 | 日本黄色视 | 日韩在线播放一区二区 | xxx色| 日韩av无码久久 | 久久在线精品视频 | 精品国产乱码久久久久久108 | www.久久久久久久 | 操一操干一干 | 五月综合激情网 | 亚洲av成人一区二区国产精品 | 欧美不卡视频 | 国产黄片毛片 | 一区二区在线免费观看视频 | 中文字幕欧美视频 | 天天天天天天天天干 | 日日撸夜夜撸 | 成人免费在线视频网站 | 国产一区2| 天天久久久 | 越南毛茸茸的少妇 | 久久99精品国产麻豆婷婷 | 中文一区二区 | 91热久久 | 中国免费毛片 | 韩国19主播内部福利vip | 国产精品suv一区二区 |