Thi*_*Lam 13 python unicode python-2.x
如果明确定义,则以下unicode和string可以自己存在:
>>> value_str='Andr\xc3\xa9'
>>> value_uni=u'Andr\xc3\xa9'
Run Code Online (Sandbox Code Playgroud)
如果我只u'Andr\xc3\xa9'分配给上面的变量,如何将其转换为'Andr\xc3\xa9'Python 2.5或2.6?
编辑:
我做了以下事情:
>>> value_uni.encode('latin-1')
'Andr\xc3\xa9'
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题.有人可以向我解释究竟发生了什么吗?
Mar*_*ers 15
你好像把你的编码搞得一团糟.看起来你真正想要的u'Andr\xe9'就是等同于'André'.
但你所拥有的似乎是一个错误解码的UTF-8编码.您可以通过将unicode字符串转换为普通字符串来修复它.我不确定最好的方法是什么,但这似乎有效:
>>> ''.join(chr(ord(c)) for c in u'Andr\xc3\xa9')
'Andr\xc3\xa9'
Run Code Online (Sandbox Code Playgroud)
然后正确解码:
>>> ''.join(chr(ord(c)) for c in u'Andr\xc3\xa9').decode('utf8')
u'Andr\xe9'
Run Code Online (Sandbox Code Playgroud)
现在它的格式正确.
但是,如果可能的话,您应该尝试找出数据首先被错误编码的原因,并在那里解决问题.
如果有u'Andr\\xc3\\xa9',则这是一个 Unicode 字符串,是从使用错误编码的字节字符串解码而来的。正确的编码是UTF-8。要将其转换回字节字符串以便您可以正确解码它,您可以使用您发现的技巧。Unicode 的前 256 个代码点是与 ISO-8859-1(别名latin1)编码的 1:1 映射。所以:
>>> u'Andr\\xc3\\xa9'.encode('latin1')\n'Andr\\xc3\\xa9'\nRun Code Online (Sandbox Code Playgroud)\n\n现在它是一个字节字符串,可以使用以下命令正确解码utf8:
>>> 'Andr\\xc3\\xa9'.decode('utf8')\nu'Andr\\xe9'\n>>> print 'Andr\\xc3\\xa9'.decode('utf8')\nAndr\xc3\xa9\nRun Code Online (Sandbox Code Playgroud)\n\n一步到位:
\n\n>>> print u'Andr\\xc3\\xa9'.encode('latin1').decode('utf8')\nAndr\xc3\xa9\nRun Code Online (Sandbox Code Playgroud)\n
你问(以评论)"""那是什么我百思不得其解.它怎么从它原来的重音符号,以它现在是什么?当你说用UTF8双编码和处理latin1,是走,共有3个编码(2 UTF8 + 1 latin1)?从原始状态到当前状态的编码顺序是什么?"""
在Mark Byers的回答中,他说""你所拥有的似乎是UTF-8编码被错误地解码了"".你接受了他的回答.但你仍然感到疑惑?好的,这是吹嘘的描述:
注意:所有字符串都将使用(隐式)显示repr().unicodedata.name()将用于验证内容.这样,控制台编码的变化不会混淆字符串的解释.
初始状态:您有一个名为u1的unicode对象.它包含e-acute:
>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
Run Code Online (Sandbox Code Playgroud)
您将u1编码为UTF-8并将结果命名为s:
>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
Run Code Online (Sandbox Code Playgroud)
你使用latin1解码s - INCORRECTLY; s使用utf8编码,而不是latin1.结果是毫无意义的垃圾.
>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
Run Code Online (Sandbox Code Playgroud)
请理解:unicode_object.encode('x').decode('y)当x!= y正常时[见下面的注释]是胡说八道; 如果你幸运,它会引发例外; 如果你运气不好,它会默默地制造胡言乱语.另外请理解,静默创建乱码并不是一个错误 - Python(或任何其他语言)没有一般方法可以检测到已经提交了废话.这特别适用于涉及处理latin1时,因为所有的256码点映射1比1与第256个Unicode代码点,所以它不可能从str_object.decode得到的UnicodeDecodeError("latin1的").
当然,异常(希望它是异常的)你可能需要通过gibberish_unicode_object.encode('y').decode('x')对你的问题的各种答案中建议的做法来反转这样的废话.
| 归档时间: |
|
| 查看次数: |
35220 次 |
| 最近记录: |