1

UTF-8 でエンコードされた文字列を左揃えにしようとしていstring.ljustます。この例外が発生します: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128). 例えば、

s = u"你好"    // a Chinese string
stdout.write(s.encode("UTF-8").ljust(20))

私は正しい軌道に乗っていますか?または、他の方法でフォーマットする必要がありますか?

よろしくお願いします。

4

1 に答える 1

5

正確なコードと受け取った正確なエラーを投稿しましたか? cp437コードは aとutf-8端末の両方でエラーをスローせずに機能するためです。いずれにせよ、端末に送信する前に Unicode 文字列を正当化する必要があります。UTF-8 でエンコードされた中国語は、エンコード時の長さが 2 ではなく 6 であるため、違いに注意してください。

>>> sys.stdout.write(s.encode('utf-8').ljust(20) + "hello")
你好              hello
>>> sys.stdout.write(s.ljust(20).encode('utf-8') + "hello")
你好                  hello

また、中国語の文字は、一般的な固定幅フォントの他の文字よりも幅が広いため、言語が混在している場合、希望どおりに整列しない場合があることに注意してください (解決策については、この回答を参照してください)。

>>> sys.stdout.write("12".ljust(20) + "hello")
12                  hello

通常、明示的なエンコーディングをスキップしてstdout. Python は、ターミナルのエンコーディングで Unicode 文字列をターミナルに暗黙的にエンコードします (「 」を参照sys.stdout.encoding)。

sys.stdout.write(s.ljust(20))

別のオプションは次を使用していprintます:

print "%20s" % s   # old-style

また:

print '{:20}'.format(s)  # new-style
于 2012-06-07T06:08:14.610 に答える