我有一个名为的文件:Abrázame.txt
我想对此进行解码,以便python了解这个'á'字符是什么,以便它会打印出来我Abrázame.txt
这是我在Scratch文件中的以下代码:
import os
s = os.path.join(r'C:\Test\AutoTest', os.listdir(r'C:\\Test\\AutoTest')[0])
print(unicode(s.decode(encoding='utf-16', errors='strict')))
我从上面得到的错误是:
Traceback (most recent call last):
File "C:/Users/naythan_onfri/.PyCharmCE2017.2/config/scratches/scratch_3.py", line 12, in <module>
print(unicode(s.decode(encoding='utf-16', errors='strict')))
File "C:\Python27\lib\encodings\utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0x74 in position 28: truncated data
我查了一下utf-16字符集,确实有'á'字符。那么为什么不能用Utf-16解码这个字符串。
我也知道'latin-1'可以工作并生成字符串即时寻找,因为这是一个自动化项目,我想确保任何具有任何注册字符的文件名都可以解码并用于其他内容该项目例如:
“在已选择文件的文件目录中打开文件资源管理器。”
循环遍历每个编解码器(请注意,我相信有93个编解码器)来找到可以解码字符串的任何一个,获得我想要的结果的最佳方法是什么?我认为有比这个解决方案更好的东西。
答案 0 :(得分:0)
您希望在第一次阅读字符串时在边缘进行解码,以便以后在代码中不会出现意外情况。在边缘,你有一个合理的机会猜测编码是什么。对于此代码,边是
os.listdir(r'C:\\Test\\AutoTest')[0]
您可以获取当前的文件系统目录编码。所以,
import sys
fs_encoding = sys.getfilesystemencoding()
s = os.path.join(r'C:\Test\AutoTest',
os.listdir(r'C:\\Test\\AutoTest')[0].decode(encoding=fs_encodig, errors='strict')
print(s)
请注意,解码后,您有一个unicode字符串,并且您不需要从中构建新的unicode()
对象。
latin-1
如果是您当前的代码页,则有效。这是一个有趣的好奇心,即使Windows支持&#34;宽&#34;带有&#34; W&#34;的字符多年来他们的API版本,python 2是基于单字节字符的,并没有使用它们。
万岁蟒蛇3。