格式: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之前打印它们。 printstring.format都使用unicodestring。

你链接的post实际上build议不要编码任何东西,并把所有内容保存为unicode。 对于你的例子,它看起来更像是:

 name1=u'öabcd' name2='oabcd' print(u'{:<15} {:<15}'.format(name1,name2)), 

既然你没有保存variables以备后用,不要担心编码和解码string。 你只会混淆你自己:)