如何在Python级别将unicode转换为字符串?

2024-06-16 08:58:43 发布

您现在位置:Python中文网/ 问答频道 /正文

如果显式定义,则以下unicode和字符串可以独立存在:

>>> value_str='Andr\xc3\xa9'
>>> value_uni=u'Andr\xc3\xa9'

如果我只将u'Andr\xc3\xa9'分配给上面这样的变量,如何在Python 2.5或2.6中将其转换为'Andr\xc3\xa9'

编辑:

我做了以下工作:

>>> value_uni.encode('latin-1')
'Andr\xc3\xa9'

解决了我的问题。有人能告诉我到底发生了什么事吗?


Tags: 字符串编辑定义valueunicode中将encodeuni
3条回答

你的编码好像弄混了。似乎你真正想要的是u'Andr\xe9',相当于'André'

但你看到的似乎是一个未正确解码的UTF-8编码。您可以通过将unicode字符串转换为普通字符串来修复它。我不知道最好的方法是什么,但这似乎有效:

>>> ''.join(chr(ord(c)) for c in u'Andr\xc3\xa9')
'Andr\xc3\xa9'

然后正确解码:

>>> ''.join(chr(ord(c)) for c in u'Andr\xc3\xa9').decode('utf8')
u'Andr\xe9'    

现在它的格式是正确的。

但是,如果可能的话,您应该先找出数据编码错误的原因,然后在那里解决这个问题。

你问(在评论中)“”“这就是让我困惑的地方。它是怎么从原来的口音变成现在的?当你说用utf8和latin1进行双重编码时,总共是3种编码(2 utf8+1 latin1)吗?从原始状态到当前状态的编码顺序是什么

在马克·拜尔斯的回答中,他说“你所拥有的似乎是一种未正确解码的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'

将u1编码为UTF-8并将结果命名为:

>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'

你用latin1解码s——不正确;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'
>>>

请理解:unicode_object.encode('x').decode('y)当x!=y通常是胡说八道;如果你运气好,它会引发一个异常;如果你运气不好,它会无声地制造出胡言乱语。另外,请理解,无声地创建乱七八糟并不是一个bug——Python(或任何其他语言)无法检测出有人犯下了无意义的错误。这尤其适用于涉及latin1的情况,因为所有256个代码点都将1映射到1,其中包含前256个Unicode代码点,因此无法从str_object.decode('latin1')获取UnicodeDecodeError。

当然,不正常的(人们希望这是不正常的)你可能需要做gibberish_unicode_object.encode('y').decode('x')来扭转这样的胡说八道,正如你的问题的各种答案所建议的那样。

value_uni.encode('utf8')或您需要的任何编码。

http://docs.python.org/library/stdtypes.html#str.encode

相关问题 更多 >