我有一个字符串,由我的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 回答
str.decode
不只是将u
添加到字符串文字中 . 它将输入字符串的字节转换为有意义的字符(即Unicode) .然后,您调用
encode
将此字符转换为字节,因为您需要"print",将它们输出到终端或任何其他OS实体(如GUI窗口) .所以,关于你的具体任务,我相信你想要的东西:
其中
'cp1251'
是IDE的编码,platform_encoding
是具有当前系统编码的变量 .在回复你的评论时:
这是不正确的假设 . 从Defining Python Source Code Encodings
所以
set fileencoding=cp1252
只是告诉解释器在解析行str = '\x80'
时如何将字符[通过编辑器输入]转换为字节 . 在str.decode
电话中不使用此信息 .你也在问,你是什么?
\x80
被简单地解释为\u0080
,这显然不是你想要的 . 看看这个问题 - Bytes in a unicode Python string .'\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 .