2010-03-19 52 views
5

我有一個包含日語字符以及「正常」的數組。 如何對齊這些打印輸出?Python UTF-8,如何對齊打印輸出

#!/usr/bin/python 
# coding=utf-8 

a1=['する', 'します', 'trazan', 'した', 'しました'] 
a2=['dipsy', 'laa-laa', 'banarne', 'po', 'tinky winky'] 

for i,j in zip(a1,a2): 
    print i.ljust(12),':',j 

print '-'*8 

for i,j in zip(a1,a2): 
    print i,len(i) 
    print j,len(j) 

輸出:

する  : dipsy 
します : laa-laa 
trazan  : banarne 
した  : po 
しました : tinky winky 
-------- 
する 6 
dipsy 5 
します 9 
laa-laa 7 
trazan 6 
banarne 7 
した 6 
po 2 
しました 12 
tinky winky 11 

感謝, //弗雷德裏克

+0

我覺得在日本的人,你有一個「正常」和羅馬字的混合。對泰國人來說...... – MtnViewMark 2010-03-19 15:19:40

回答

4

使用unicodedata.east_asian_width函數,在計算字符串的長度時,要跟蹤哪些字符是窄而寬的。

#!/usr/bin/python 
# coding=utf-8 

import sys 
import codecs 
import unicodedata 

out = codecs.getwriter('utf-8')(sys.stdout) 

def width(string): 
    return sum(1+(unicodedata.east_asian_width(c) in "WF") 
     for c in string) 

a1=[u'する', u'します', u'trazan', u'した', u'しました'] 
a2=[u'dipsy', u'laa-laa', u'banarne', u'po', u'tinky winky'] 

for i,j in zip(a1,a2): 
    out.write('%s %s: %s\n' % (i, ' '*(12-width(i)), j)) 

輸出:

する   : dipsy 
します  : laa-laa 
trazan  : banarne 
した   : po 
しました  : tinky winky 

它看起來不正確在某些Web瀏覽器的字體,但在終端窗口中,他們排隊正確。

+0

選項卡不是解決方案,我真正在做的是生成包含日語動詞變形的獅身人面像表。我將檢查east_asian_width函數... – 2010-03-19 12:24:13

+0

完美,正是我至少在理論上尋找的東西。試圖運行它雖然給我這個: $ ./try.py 回溯(最近呼叫最後): 文件「./try.py」,第12行,在 print i,''*(12-寬度(i)),':',j UnicodeEncodeError:'latin-1'編解碼器無法編碼位置0-1中的字符:序號不在範圍內(256) – 2010-03-19 12:34:11

+0

@Fredrick ouch,您可能需要查看' sys.setdefaultencoding'。 http://blog.ianbicking.org/illusive-setdefaultencoding.html – 2010-03-19 12:37:20

2

使用Unicode對象,而不是字節字符串:

#!/usr/bin/python 
# coding=utf-8 

a1=[u'する', u'します', u'trazan', u'した', u'しました'] 
a2=[u'dipsy', u'laa-laa', u'banarne', u'po', u'tinky winky'] 

for i,j in zip(a1,a2): 
    print i.ljust(12),':',j 

print '-'*8 

for i,j in zip(a1,a2): 
    print i,len(i) 
    print j,len(j) 

Unicode對象直接處理的字符。

+0

這並不能解決問題。 – 2010-03-19 12:16:35

+0

使用'串'我得到 UnicodeEncodeError:'拉丁-1'編解碼器不能編碼字符位置0-1:序號不在範圍內(256) 通過執行打印j.encoding('utf-8 ') 但這似乎非常尷尬... – 2010-03-19 12:21:27

+0

@ jleedev - 我的控制檯說不然。你可以說得更詳細點嗎?你得到了什麼結果? @ Fredrik-聽起來像你的終端想要使用Latin-1編碼。你必須找到一種方法來說服它使用UTF-8,或者將你的輸出寫入文件而不是打印(我推薦'import codecs; f = codecs.open('output.txt',encoding ='utf -8' )')。祝你好運! – jcdyer 2010-03-19 15:08:44