UnicodeEncodeError : 'charmap'编解码器无法将字符"\x80"编码到位置 0 :字符映射到<undefined>



我有一个字符串,由我的IDE(非常旧的Boa构造函数)自动转换为字节码。现在我想将其转换为 unicode,以便在特定机器上使用编码打印它(Windows 上的 cp1252 或 Linux 上的 utf-8)。

我使用两种不同的方式。其中一个正在工作,另一个不工作。但是为什么?

这里是工作版本:

#!/usr/bin/python
# vim: set fileencoding=cp1252 :
str = 'x80'
str = str.decode('cp1252') # to unicode
str = str.encode('cp1252') # to str
print str

这里是无效版本:

#!/usr/bin/python
# vim: set fileencoding=cp1252 :
str = u'x80'
#str = str.decode('cp1252') # to unicode
str = str.encode('cp1252') # to str
print str

在版本 1 中,我通过解码函数将 str 转换为 unicode。在版本 2 中,我通过字符串前面的 u 将 str 转换为 unicode。但我想,这两个版本会完全一样吗?

str.decode不仅仅是在字符串文字前面加上u。 它将输入字符串的字节转换为有意义的字符(即 Unicode)。

然后您调用encode将此字符转换为字节,因为您需要"打印",将它们输出到终端或任何其他操作系统实体(如 GUI 窗口)。

所以,关于你的具体任务,我相信你想要这样的东西:

s = 'x80'
print s.decode('cp1251').encode(platform_encoding)

其中'cp1251'是 IDE 的编码,platform_encoding是具有当前系统编码的变量。


在回复您的评论时:

但是str.decode应该使用源代码编码(从 文件中的第 2 行)进行解码。所以不应该有区别 U

这是不正确的假设。 从定义 Python 源代码编码

然后,Python 解析器使用编码信息来 使用给定的编码解释文件。

所以set fileencoding=cp1252只是告诉解释器在解析第 str = 'x80' 行时如何将 [您通过编辑器输入的] 字符转换为字节。 此信息不会在str.decode呼叫期间使用。

你也在问,你'\x80'是什么? x80被简单地解释为u0080,这显然不是你想要的。 看看这个问题 - Unicode Python 字符串中的字节。

'x80'.decode('cp1252')不给出u'u0080'(这与u'x80'相同)。

Windows 代码页 1252 中的字节0x80解码为 U+20AC 欧元符号 Unicode 字符。

有一种编码,其中所有字节0x00 0xFF解码为具有相同数字 U+0000 到 U+00FF 的 Unicode 字符:它是iso-8859-1 。使用该编码,您的示例将起作用。

Windows cp1252 与该编码类似,但并不相同:虽然0xA0到0xFF与iso-8859-1相同,因此您可以获得这些字符的直接映射行为,但0x80到0x9F的字节是来自其他 Unicode 块的各种额外符号,而不是不可见(并且基本上无用)的控制代码 U+0080 到 U+009F。

相关内容

最新更新