python中英文打印對(duì)齊解決方案
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在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ì)齊效果。





