I got three UTF-8 stings:
hello, world
hello, 世界
hello, 世rld
I only want the first 10 ascii-char-width so that the bracket in one column:>
When trying to line up ASCII text with Chinese in fixed-width font, there is a set of full width versions of the printable ASCII characters. Below I made a translation table of ASCII to full width version:
# coding: utf8
# full width versions (SPACE is non-contiguous with ! through ~)
SPACE = '\N{IDEOGRAPHIC SPACE}'
EXCLA = '\N{FULLWIDTH EXCLAMATION MARK}'
TILDE = '\N{FULLWIDTH TILDE}'
# strings of ASCII and full-width characters (same order)
west = ''.join(chr(i) for i in range(ord(' '),ord('~')))
east = SPACE + ''.join(chr(i) for i in range(ord(EXCLA),ord(TILDE)))
# build the translation table
full = str.maketrans(west,east)
data = '''\
蝴蝶(A song)
心之城(Another song)
支持你的爱人(Yet another song)
根生的种子
鸽子歌(Cucurrucucu palo whatever)
林地之间
蓝光
在你眼里
肖邦离别曲
西行(魔戒王者再临主题曲)(Into something)
深陷爱河
钟爱大地
时光流逝
卡农
舒伯特小夜曲(SERENADE)
甜蜜的摇篮曲(Sweet Lullaby)
'''
# Replace the ASCII characters with full width, and create a song list.
data = data.translate(full).rstrip().split('\n')
# translate each printable line.
print(' ----------Songs-----------'.translate(full))
for i,song in enumerate(data):
line = '|{:4}: {:20.20}|'.format(i+1,song)
print(line.translate(full))
print(' --------------------------'.translate(full))
----------Songs-----------
| 1: 蝴蝶(A song) |
| 2: 心之城(Another song) |
| 3: 支持你的爱人(Yet another s|
| 4: 根生的种子 |
| 5: 鸽子歌(Cucurrucucu palo|
| 6: 林地之间 |
| 7: 蓝光 |
| 8: 在你眼里 |
| 9: 肖邦离别曲 |
| 10: 西行(魔戒王者再临主题曲)(Into s|
| 11: 深陷爱河 |
| 12: 钟爱大地 |
| 13: 时光流逝 |
| 14: 卡农 |
| 15: 舒伯特小夜曲(SERENADE) |
| 16: 甜蜜的摇篮曲(Sweet Lullaby|
--------------------------
It's not overly pretty, but it lines up.