unicode处理一事

根据python cookbook上说的, 字符编码处理的大原则:

任何时候从”程序外部”拿到一个字符串, 都用它构建一个unicode对象, 例如, 从互联网上收到的, 从磁盘文件中读到的, 从用户输入得到的字符串;

任何时候往”程序外部”输出一个字符串, 都明确字符串的编码, 并把它转换为那种编码的bytestring.

不幸地是, 我仍旧遇到的问题. 是这样的:

我的代码从互联网上拿到了一段javascript代码, 代码中有类似这样的字符串u’http%3A//%E8%AF%B8%E8%91%9B%E4%BA%AE’

首先我是这样处理的:

>>> s=u'http%3A//%E8%AF%B8%E8%91%9B%E4%BA%AE'
>>> l=urllib.unquote(s)
>>> l
u'http://\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae'
>>> e=l.split('/')[2]
>>> e
u'\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae'
>>> print e
诸è 亮

这显然不是我想要的,  问题在于e这个字符串虽然前置了一个’u’, 但它其实压根就是utf8编码的bytestring.

>>> print('\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae')
诸葛亮

所以为了获得这个假的unicode编码中的bytestring, 废话不说, 经过了下面的流程就拿到了bytestring了.

>>> e
u'\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae'
>>> map(ord,e)
[232, 175, 184, 232, 145, 155, 228, 186, 174]
>>> map(chr,map(ord,e))
['\xe8', '\xaf', '\xb8', '\xe8', '\x91', '\x9b', '\xe4', '\xba', '\xae']
>>> ''.join(map(chr,map(ord,e)))
'\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae'
>>> print ''.join(map(chr,map(ord,e)))
诸葛亮

另外, 还在stackoverflow上看到了这样一种处理: http://stackoverflow.com/questions/11174790/convert-unicode-string-to-byte-string

>>> e.encode('latin1')
'\xe8\xaf\xb8\xe8\x91\x9b\xe4\xba\xae'
>>> print e.encode('latin1')
诸葛亮

我去 ,转化为latin1之后, 完全照样的把字节码复制过来了. 这个处理的依据是这名话:ISO 8859-1 (aka Latin-1) maps the first 256 Unicode codepoints to their byte values.

大约latin-1就是这样一种编码, 对于unicode的前256个code points, 丫直接对应为它的字节码了.

下面是我在github上提得问题: http://stackoverflow.com/questions/22959811/how-to-fix-a-string-which-says-its-a-unicode-but-is-in-fact-bytestring/22984720#22984720