Python中英文對齊終極解決方案


問題描述

強迫症發作

對齊結果


成績單對齊

# 漢字占兩英文寬,則每存在一個漢字少填充一個長度
def pad_len(string, length):
    return length - len(string.encode('GBK')) + len(string)

...

print("{0:<{len1}}\t{1:<{len2}}\t{2:>{len3}}".format(*line, len1=pad_len(line[0], 8), len2=pad_len(line[1], 20), len3=pad_len(line[2], 20)))

大學列表對齊

看起來是對齊的,在中英文字體寬度不是2倍寬度的情況下,但是format具有不確定性:

 ulist = []
    ulist.append([1, "清華大學", "10", "北京市"])
    ulist.append([2, "中國科學技術大學", "10", "安徽合肥"])
    ulist.append([3, "復旦大學", "10", "上海"])

    print('^' * 40, '四列三行:列不同,行相同', '^' * 40)

    for ul in ulist:
        print("{0:{4}^6}\t{1:{4}<20}\t{2:{4}^10}\t{3:{4}<10}".format(*ul, chr(12288)))

    print('+' * 40, '三列三行:列不同,行相同', '+' * 40)

    for ul in ulist:
        print("{0:^6}\t{1:{4}<20}\t{2:^10}".format(*ul, chr(12288)))

    ulist.insert(0, ['編號', '大學', '評價', '省市'])

    print('+' * 40, '四列四行:不僅列不同,行也不同', '+' * 40)

    for ul in ulist:
        print("{0:{4}^6}\t{1:{4}<20}\t{2:{4}^10}\t{3:<10}".format(*ul, chr(12288)))

    print('x' * 40, '三列四行:不僅列不同,行也不同', 'x' * 40)

    for ul in ulist:
        print("{0:{4}^6}\t{1:{4}<20}\t{2:^10}".format(*ul, chr(12288)))

注意,行數相同(且每一列的字符行都和上一行的字符編碼長度一樣,前提條件),三列的時候和四列的情況還不一樣,四列多一個 chr(12288)的填充字符。中英文混排列,總共N個列,也就是 N-1個列都需要chr(12288)。

列數相同(非前提條件,僅排除干擾因素),三行和四行(四行的第一行和第二行的字符編碼長度不一樣),所需要的 chr(12288)的填充字符 也不一樣,少一個就不能對齊。

結論

結論一:在中英文長度倍數不確定的等寬字體下,能否對齊是不確定的,具體表現在:需要嘗試加填充字符,且個數隨着行列變化。
結論二:在中英文長度倍數確定為2的等寬字體下,能否對齊是確定的,具體表現在:無需設置填充字符,且可以統一計算長度。
結論三:面向字體編程,等寬字體對齊還靠運氣。

本文例子參考了 他的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM