格式:UTF-8编码

时间:2015-09-27 22:59:38

标签: python excel unicode encoding utf-8

当我有“ä”,“ü”,“ö”等字符时,输出格式错误。 我从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。

3 个答案:

答案 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和你所链接的问题都指出,不要在打印之前对这些字符串进行编码。 printstring.format都使用unicode字符串。

答案 2 :(得分:0)

您链接的帖子实际上建议不对任何内容进行编码,并将所有内容保存在unicode中。对于您的示例,它看起来更像是:

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

由于您未保存变量以供日后使用,因此请不要担心编码和解码字符串。你会更加困惑自己:)