首页 > 解决方案 > Python 2.7:打印出解码的字符串

问题描述

我有一个名为: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 个编解码器)以找到可以解码字符串的任何一个,这是获得我正在寻找的结果的最佳方式?我认为有比那个解决方案更好的东西。

标签: pythonwindowspython-2.7character-encodingcharacter

解决方案


当您第一次读取字符串时,您希望在边缘进行解码,这样您以后的代码中就不会出现意外。在边缘,您有一些合理的机会猜测该编码是什么。对于此代码,边缘是

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 多年来一直使用“W”版本的 API 支持“宽”字符,但 python 2 是基于单字节字符的并且不使用它们。

蟒蛇3万岁。


推荐阅读