格式:UTF-8编码时错误的string宽度
当我有“ä”,“ü”,“ö”等字符的时候,我得到了一个错误的格式输出。我从excel-sheet-column中读取名字,有时候是Unicodestring,我编码为UTF-8。 我的简化代码:
import xlrd name1 = (xl_sheet.cell_value(row,5)).encode('utf8') # use this because this cell can have strings with chars like "ö" name2 = (xl_sheet.cell_value(row,7)).encode('utf8') print('{:<15} {:<15}'.format(name1,name2)),
当我不使用.encode,我得到这个错误:
'ascii' codec can't encode character u'\xf6' in position 1: ordinal not in range(128)
我发现了一个类似的post: Pythonstring格式的宽度在string中像é或ö这样的字符错误 ,但是我不知道如何实现,在我的情况下!
我的输出表是这样的:
oabcd oabcd öabcd oabcd oabcd oabcd
当variables中出现焦炭时,输出不正确。
Excel文件具有CP-1252“Windows Unicode”编码。
xlrd.open_workbook(文件名).encoding的输出是:utf_16_le。
这很简单:
import sys reload(sys) sys.setdefaultencoding("utf-8")
做的伎俩。 主代码中的.encode('utf8')是不必要的。
(我假设你只打印拉丁脚本,如果你混合脚本,这将变得非常复杂,你可能应该 问一个问题 search一个具体答案)
这样做的一个可能的问题是结合标记。 像ö
这样的重音字母可以保存为两个Unicode字符, o
和组合¨
。 这些是2个字符,但打印时只占用一个空格。 对于许多组合,还有一个组合formsö
,它在一个字符中编码该字母。 所以:
>>> len("ö") 2 >>> len("ö") 1
您可以尝试使用unicodedata.normalize('NFC', name)
将这些对转换为组合forms,但是在所有情况下都不起作用,因为并非所有组合都具有组合forms。
既然zizouz和你链接的问题指出,不要编码这些string之前打印它们。 print
和string.format
都使用unicodestring。
你链接的post实际上build议不要编码任何东西,并把所有内容保存为unicode。 对于你的例子,它看起来更像是:
name1=u'öabcd' name2='oabcd' print(u'{:<15} {:<15}'.format(name1,name2)),
既然你没有保存variables以备后用,不要担心编码和解码string。 你只会混淆你自己:)