在Python中处理非ASCII字符的可靠方法?

Pyd*_*man 1 python unicode character-encoding non-ascii-characters python-2.7

我有一个电子表格列,其标题包含非 ASCII 字符,因此:

\n\n
\'\xc3\xaf\xc2\xbb\xc2\xbfCampaign\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我将此字符串放入解释器中,我会得到:

\n\n
\'\\xc3\\xaf\\xc2\\xbb\\xc2\\xbfCampaign\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

rows该字符串是a 中的键之一csv.DictReader()

\n\n

value当我尝试使用此键填充新字典时:

\n\n
spends[\'\xc3\xaf\xc2\xbb\xc2\xbfCampaign\'] = 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到:

\n\n
Key Error: \'\\xc3\\xaf\\xc2\\xbb\\xc2\\xbfCampaign\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我打印行键的值,我可以看到它是\'\\xef\\xbb\\xbfCampaign\'

\n\n

显然,我可以更新我的程序来访问这个密钥:

\n\n
spends[\'\\xef\\xbb\\xbfCampaign\']\n
Run Code Online (Sandbox Code Playgroud)\n\n

但在 Python 中是否有“更好”的方法来做到这一点?事实上,如果该键的值每次更改为包含其他非 ASCII 字符,那么处理可能出现的任何非 ASCII 字符的包罗万象的方法是什么?

\n

roe*_*and 5

您的具体问题是文件的前三个字节"\\xef\\xbb\\xbf"。这是字节顺序掩码的 UTF-8 编码,通常放在文本文件前面以指示它们是使用 UTF-8 编码的。您应该剥离这些字节。请参阅在 Python 中从 gzip 压缩的 CSV 中删除 BOM

\n\n

其次,您使用错误的编解码器进行解码。"\xc3\xaf\xc2\xbb\xc2\xbf"是使用 Windows-1252 字符集解码这些字节时得到的结果。这就是为什么如果您在源文件中使用这些字符,字节看起来会有所不同。请参阅Python 2 Unicode howto

\n

  • 您可以使用“utf-8-sig”编码来自动处理 BOM。 (2认同)