python中英文打印對齊解決方案
掃描二維碼
隨時隨地手機(jī)看文章
在python中,有時候會出現(xiàn)中英文混合輸出的情形,但是由于中文默認(rèn)是全角格式(一個中文字符占用兩個字符寬度),這會對python原生的print函數(shù)帶來一些障礙。尤其是用戶用print對齊輸出的時候,這種差異會導(dǎo)致文本無法準(zhǔn)確對齊。為了解決這種問題,這里提出一種方法。
python的print函數(shù),在進(jìn)行對齊處理的時候,首先需要判斷字符串的長度。這個就是通常的len()函數(shù)。python在計算字符串長度的時候,任何字符都只會被算作長度1,無論全角還是半角,所以會有下面的情況:
> len("一二三")
3
> len("123")
3
但是對于對于全角字符,打印寬度是兩個字節(jié),半角字符是單個字節(jié),譬如下例:

這里很明顯的看到,同樣的長度為3的字符,全角字符是半角字符一倍的打印長度。
這種差距,會影響到print的對齊打印,譬如下例:

這個是一個右對齊的示例,print函數(shù)首先計算了打印對象的長度len(),得到了這個打印對象的長度為3(此處忽略全角和半角),所以print會從右對齊的20節(jié)點(diǎn)開始排布,意即print把從第18 個字符的位置開始打印,這里用紅線表示,所以無論全角還是半角對象,print都會從第18 個字符的位置打印。
按照正常字符(半角),文本會在第20個字符位置完成打印,如上圖的藍(lán)線位置,但是由于全角字符的占用了更多的字符,所以這里的全角字符會占用18~23 字符位置,這樣會導(dǎo)致打印對齊出現(xiàn)問題:包含全角的字符串會超出限定的界定位置。譬如上述的藍(lán)色位置。超出的數(shù)量也很好理解,就是全角字符的個數(shù),意即上述綠線的位置,上述示例包含三個全角字符,就會產(chǎn)出三個字符位置。
以此類推,如果print在同行繼續(xù)打印其他字符,字符串里邊包含全角字符,那么后續(xù)的打印就會一直被前述全角字符的打印結(jié)果影響,
這種方式也適用于全半角混合輸出,示例如下:

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

了解了上述原理,用戶可以根據(jù)這種特性,自動完成對于全角半角混合模式的打印對齊處理。思路是:在對齊寬度上對全角字符額外的寬度進(jìn)行考慮,這樣可以構(gòu)建一個中英文混合模式的打印對齊。代碼如下:
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ī)制,輔助計算全角字符的數(shù)量的方法,實現(xiàn)的了全半角混合打印的對齊效果。





