在python中:
>>> "\xc4\xe3".decode("gbk").encode("utf-8")
'\xe4\xbd\xa0'
>>> "\xc4\xe3".decode("gbk")
u'\u4f60'
我们可以得出两个结论:
1. \ xc4 \ xe3 in gbk encode = \ xe4 \ xbd \ xa0 in utf-8
2. \ xc4 \ xe3 in gbk encode = \ x4f \ x60 in unicode(或者说在ucs-2中)
> iconv("\xc4\xe3",from="gbk",to="utf-8",toRaw=TRUE)
[[1]]
[1] e4 bd a0
> iconv("\xc4\xe3",from="gbk",to="unicode",toRaw=TRUE)
[[1]]
[1] ff fe 60 4f
现在,结论1是正确的,它在python中与在R
中一样
结论2是一个谜题,
究竟是什么\ xc4 \ xe3在gbk编码= ??在unicode
在python中它是你'\ u4f60',在R中它是ff fe 60 4f
是平等的?哪一个是正确的?它们都是正确的吗?
答案 0 :(得分:6)
在python中,\uxxxx
表示法指的是Unicode代码点,而不是那些代码点的任何编码。
UCS-2,UTF-16,UTF-8都是能够以字节为单位捕获适合存储在文件中的代码点的编码,用于通过网络传输等。
\u4f60
代码点的R表示包括UTF-16 Byte Order Mark或BOM。它表示选择了什么字节顺序,其中0xFFFE表示小端。当你编码为UTF-16时,Python也包括它:
>>> u'\uf460'.encode('utf16')
'\xff\xfe`\xf4'
big-endian等价物是0xFEFF。您可以在python中显式编码为utf-16be
或utf-16le
以避免包含BOM,因为您做出了明确的选择:
>>> u'\uf460'.encode('utf-16be')
'\xf4`'
>>> u'\uf460'.encode('utf-16le')
'`\xf4'
你真的应该阅读Joel Spolsky Unicode文章以及Python Unicode HOWTO以更全面地理解Unicode和编码之间的区别。