unicode号码到底是什么?

时间:2012-09-08 11:12:05

标签: python r unicode

在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中)

R中的

> 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
是平等的?哪一个是正确的?它们都是正确的吗?

1 个答案:

答案 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-16beutf-16le以避免包含BOM,因为您做出了明确的选择:

>>> u'\uf460'.encode('utf-16be')
'\xf4`'
>>> u'\uf460'.encode('utf-16le')
'`\xf4'

你真的应该阅读Joel Spolsky Unicode文章以及Python Unicode HOWTO以更全面地理解Unicode和编码之间的区别。