日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 艾思后端實(shí)現(xiàn)

在python中,有時(shí)候會(huì)出現(xiàn)中英文混合輸出的情形,但是由于中文默認(rèn)是全角格式(一個(gè)中文字符占用兩個(gè)字符寬度),這會(huì)對(duì)python原生的print函數(shù)帶來一些障礙。尤其是用戶用print對(duì)齊輸出的時(shí)候,這種差異會(huì)導(dǎo)致文本無法準(zhǔn)確對(duì)齊。為了解決這種問題,這里提出一種方法。

python的print函數(shù),在進(jìn)行對(duì)齊處理的時(shí)候,首先需要判斷字符串的長(zhǎng)度。這個(gè)就是通常的len()函數(shù)。python在計(jì)算字符串長(zhǎng)度的時(shí)候,任何字符都只會(huì)被算作長(zhǎng)度1,無論全角還是半角,所以會(huì)有下面的情況:

> len("一二三")    
3
> len("123")
3

但是對(duì)于對(duì)于全角字符,打印寬度是兩個(gè)字節(jié),半角字符是單個(gè)字節(jié),譬如下例:

這里很明顯的看到,同樣的長(zhǎng)度為3的字符,全角字符是半角字符一倍的打印長(zhǎng)度。

這種差距,會(huì)影響到print的對(duì)齊打印,譬如下例:

這個(gè)是一個(gè)右對(duì)齊的示例,print函數(shù)首先計(jì)算了打印對(duì)象的長(zhǎng)度len(),得到了這個(gè)打印對(duì)象的長(zhǎng)度為3(此處忽略全角和半角),所以print會(huì)從右對(duì)齊的20節(jié)點(diǎn)開始排布,意即print把從第18 個(gè)字符的位置開始打印,這里用紅線表示,所以無論全角還是半角對(duì)象,print都會(huì)從第18 個(gè)字符的位置打印。
按照正常字符(半角),文本會(huì)在第20個(gè)字符位置完成打印,如上圖的藍(lán)線位置,但是由于全角字符的占用了更多的字符,所以這里的全角字符會(huì)占用18~23 字符位置,這樣會(huì)導(dǎo)致打印對(duì)齊出現(xiàn)問題:包含全角的字符串會(huì)超出限定的界定位置。譬如上述的藍(lán)色位置。超出的數(shù)量也很好理解,就是全角字符的個(gè)數(shù),意即上述綠線的位置,上述示例包含三個(gè)全角字符,就會(huì)產(chǎn)出三個(gè)字符位置。

以此類推,如果print在同行繼續(xù)打印其他字符,字符串里邊包含全角字符,那么后續(xù)的打印就會(huì)一直被前述全角字符的打印結(jié)果影響,

這種方式也適用于全半角混合輸出,示例如下:

對(duì)應(yīng)的,居中對(duì)齊模式也會(huì)有類似的影響

了解了上述原理,用戶可以根據(jù)這種特性,自動(dòng)完成對(duì)于全角半角混合模式的打印對(duì)齊處理。思路是:在對(duì)齊寬度上對(duì)全角字符額外的寬度進(jìn)行考慮,這樣可以構(gòu)建一個(gè)中英文混合模式的打印對(duì)齊。代碼如下:

def get_number(char):
count = 0
for item in char:
# chinese char and chinese punctuation mark
if 0x4E00 <= ord(item) <= 0x9FA5 or 0xFF00 <= ord(item) <=0xFFEF or 0x3000 <= ord(item) <= 0x303F:
count += 1
return count

def print_hybrid(char, align, length):
if align=='l' or align=='left' :
anchor = '<'
elif align=='c' or align=='center':
anchor = '^'
elif align=='r' or align=='right':
anchor = '>'
else:
ut.print_error('Not support align type. Current support is l(left), c(center), r(right)')
return -1
add_len = get_number(char)
if add_len >= length:
p_len = 0
else:
p_len = length - add_len
return f'{char:{anchor}{p_len}}'

各種混合模式打印示例:

可見,此種方法建立在print原生的打印機(jī)制,輔助計(jì)算全角字符的數(shù)量的方法,實(shí)現(xiàn)的了全半角混合打印的對(duì)齊效果。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉