首页 文章

UnicodeEncodeError:'charmap'编解码器可以't encode character ' \ x80'位置0:字符映射到<undefined>

提问于
浏览
0

我有一个字符串,由我的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 . 但我想,这两个版本会完全一样吗?

2 回答

  • 1

    str.decode 不只是将 u 添加到字符串文字中 . 它将输入字符串的字节转换为有意义的字符(即Unicode) .

    然后,您调用 encode 将此字符转换为字节,因为您需要"print",将它们输出到终端或任何其他OS实体(如GUI窗口) .

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

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

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


    在回复你的评论时:

    但str.decode应该使用源代码编码(从文件中的第2行)进行解码 . 所以对你来说应该没有区别

    这是不正确的假设 . 从Defining Python Source Code Encodings

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

    所以 set fileencoding=cp1252 只是告诉解释器在解析行 str = '\x80' 时如何将字符[通过编辑器输入]转换为字节 . 在 str.decode 电话中不使用此信息 .

    你也在问,你是什么? \x80 被简单地解释为 \u0080 ,这显然不是你想要的 . 看看这个问题 - Bytes in a unicode Python string .

  • 1

    '\x80'.decode('cp1252') 不给 u'\u0080' (与 u'\x80' 相同) .

    Windows code page 1252中的字节0x80解码为Unicode字符 U 20AC欧元符号 .

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

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

相关问题