2014-03-24 82 views
2

我认为我主宰了Python 2中的所有Unicode东西,但似乎有些东西我不明白。我从的HTML去我python脚本该用户输入:如何将包含unicode字符的字符串转换为unicode?

a = "m\xe9dico" 

我想这是médico(也就是医生)。所以,来转换为Unicode我做:

a.decode("utf-8") 

或者:

unicode(a, "utf-8") 

但这是抛出:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128) 

如何才能做到这一点?

+0

这已经是unicode。 utf-8版本将是'm \ xc3 \ xa9dico'。 –

+0

@DanielRoseman:在Python 3中,它将是一个unicode文字,但这是Python 2,因此它是8位数据,因此最好是Latin-1。 Ofc这是一个Unicode兼容的编码,但我认为误导只是称之为“unicode”。 –

回答

5

这不是UTF-8:

print txt.decode('iso8859-1') 
Out[14]: médico 

如果你想UTF-8字符串,使用:

txt.decode('iso8859-1').encode('utf-8') 
Out[15]: 'm\xc3\xa9dico' 
+1

谢谢,+1。我通过将HTML发送给我的CGI脚本来解决这个问题,但这不是我的问题,所以我会接受这一点。 – cdonts

2

您可以前缀与u您的字符串将其标记为字面一个unicode :

>>> a = u'm\xe9dico' 
>>> print a 
médico 
>>> type(a) 
<type 'unicode'> 

,或者到现有的字符串转换:

>>> a = 'm\xe9dico' 
>>> type(a) 
<type 'str'> 
>>> new_a = unicode(a,'iso-8859-1') 
>>> print new_a 
médico 
>>> type(new_a) 
<type 'unicode'> 
>>> new_a == u'm\xe9dico' 
True 

延伸阅读:Python docs - Unicode HOWTO

+0

感谢您的回答,但我没有定义'a','cgi'模块正在这样做。 – cdonts

+0

谢谢,这是有效的。但是这会返回'False':'a == u“médico”'。有任何想法吗? – cdonts

+0

如果您将其与'new_a'进行比较,您会得到'True',它可能无法自动转换'a'。 – keyser