【发布时间】:2016-08-19 10:29:14
【问题描述】:
我知道有很多关于 Python 2 上的“UTF-8”编码问题的讨论,但到目前为止我无法找到解决问题的方法。我目前正在创建一个脚本来获取文件的名称并将其超链接到 xlwt 中,以便可以通过在电子表格中单击来访问该文件。问题是,这些文件的某些名称包含非 ASCII 字符。
问题 1
我使用以下行来检索文件的名称。顺便说一下,文件夹里只有一个文件。
>>f = filter(os.path.isfile, os.listdir(tmp_path))[0]
然后
>>print f
'521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc'
>>print sys.stdout.encoding
'UTF-8'
>>f.decode("UTF-8")
*** UnicodeDecodeError: 'utf8' codec can't decode byte 0xe7 in position 76: invalid continuation byte
通过浏览这里的讨论,我意识到“\xe7\xe3o”不是“UTF-8”编码。运行以下行似乎支持这一点。
>>f.decode("latin-1")
u'521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc'
那么我的问题是,当系统编码设置为“UTF-8”时,为什么变量 f 被编码为“latin-1”?
问题 2
虽然 f.decode("latin-1") 为我提供了我想要的输出,但我仍然无法将变量提供给电子表格中的超链接函数。
>>data.append(["File", xlwt.Formula('HYPERLINK("%s";"%s")' % (os.path.join(dl_path,f.decode("latin-1")),f.decode("latin-1")))])
*** FormulaParseException: can't parse formula HYPERLINK("u'H:\\Mad Lab\\SE Doc Crawler\\bovespa\\download\\521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc's;"u'521001ldrAvisoAcionistas(Retifica\xe7\xe3o)_doc's)
显然,结束的双引号被吃掉并被“'s”后缀取代。有人可以帮忙解释这里发生了什么吗? 0.0
哦,如果有人可以提出上述问题 2 的解决方案,那么我将非常感激 - 因为您将让我的周末免于痛苦!
提前谢谢大家!
【问题讨论】:
-
文件系统编码总是与语言环境不同(stdout 和 stdin 编码)。请查看
sys.getfilesystemencoding()。 -
您能告诉我是什么操作系统,您使用的是控制台还是 IDLE、PyCharm、Intellij 或 Eclipse 等 IDE,以便我给您具体的答案?
-
@MartijnPieters sys.getfilesystemencoding() 抛出“mbcs”
-
@AlastairMcCormack 我使用的是 Windows 7,从 PyCharm IDE 运行。
-
@kerwei:
mbcs是 Windows 支持的宽字符编码之一,它不是 UTF-8,请参阅Difference between MBCS and UTF-8 on Windows。只需使用 Python 提供的'mbcs'编解码器即可。
标签: python-2.7 encoding utf-8 iso-8859-1 xlwt