当我有“ä”,“ü”,“ö”等字符时,输出格式错误。 我从excel-sheet-column中读取名称,这些列有时是Unicode字符串,我将其编码为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)
我发现了一个类似的帖子:Python String format width wrong when characters like é or ö in the string,但我不知道如何在我的情况下实现这一点!?
我的输出表是这样的:
oabcd oabcd
öabcd oabcd
oabcd oabcd
当f.e. char'ö'在变量中,然后输出不正确。
Excel-File具有CP-1252“Windows Unicode”编码。
xlrd.open_workbook(filename)的输出.encoding是:utf_16_le。
答案 0 :(得分:2)
这很简单:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
诀窍。主代码中的.encode('utf8')不是必需的。
答案 1 :(得分:1)
(我假设你只是打印拉丁文脚本。如果你混合脚本,这将变得非常复杂,你应该问一个问题专门搜索一个问题的答案 )
执行此操作时可能出现的问题是组合标记。像ö
这样的重音字母可以保存为两个Unicode字符,o
和组合¨
。这些是2个字符,但在打印时只占用一个空格。对于许多组合,还有一个组合形式ö
,它在一个字符中对该字母进行编码。所以:
>>> len("ö")
2
>>> len("ö")
1
您可以尝试使用unicodedata.normalize('NFC', name)
将这些对转换为合并表单,但它并不适用于所有情况,因为并非所有组合都具有组合形式。
由于zizouz和你所链接的问题都指出,不要在打印之前对这些字符串进行编码。 print
和string.format
都使用unicode字符串。
答案 2 :(得分:0)
您链接的帖子实际上建议不对任何内容进行编码,并将所有内容保存在unicode中。对于您的示例,它看起来更像是:
name1=u'öabcd'
name2='oabcd'
print(u'{:<15} {:<15}'.format(name1,name2)),
由于您未保存变量以供日后使用,因此请不要担心编码和解码字符串。你会更加困惑自己:)