背景:在“现代”(Excel 97-2003)XLS 文件中,文本有效地存储为 Unicode。在较旧的文件中,文本存储为 8 位字符串,“代码页”记录告诉它是如何编码的,例如整数 1252 对应于称为cp1252
or的编码windows-1252
。无论哪种情况,都xlrd
将提取的文本呈现为 unicode 对象。
请将此行插入您的代码中:
print data.biff_version, data.codepage, data.encoding
如果你有一个新文件,你应该看到
80 1200 utf_16_le
无论如何,请编辑您的问题以报告结果。
问题 1:encoding_override
仅当文件是旧文件并且您知道/怀疑代码页记录被省略或错误时才需要。如果文件是新文件,则忽略它。您真的知道该文件是 Excel-97 之前的文件并且文本是用 UTF-8 编码的吗?如果是这样,那只能是一些被严重欺骗的第三方软件创建的,如果你用Excel打开它,Excel会炸毁;带着棒球棒拜访作者。否则,不要使用 encoding_override。
问题 2:你应该有unicode
对象。要显示它们,您需要对它们进行编码(而不是解码)unicode
以str
使用合适的编码。print unicode_object.decode('shift-jis')
没有引发异常并打印问号是非常令人惊讶的。
为了帮助理解这一点,请将您的代码更改为如下所示:
text = a.rowvalues(i)[1]
print i, repr(text)
print repr(text.decode('shift-jis'))
并报告结果。
以便我们可以帮助您选择合适的编码(如果有),请告诉我们您使用的操作系统的版本,以及以下显示内容:
print sys.stdout.encoding
import locale
print locale.getpreferredencoding()
进一步阅读:
(1) xlrd 文档(关于 Unicode 的部分,就在前面)...包含在发行版中,或者在此处获取最新提交。
(2) Python Unicode HOWTO。