Python - unicode字符串中的ASCII编码字符串;如何删除 'u'?

Python - ASCII encoding string in the unicode string; how to remove that 'u'?

当我在中文中使用 python 模块 'pygoogle' 时,我得到了 url like u'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'

它是 unicode 但包含 ascii。我尝试将其编码回 utf-8,但代码也被更改了。

a =  u'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
a.encode('utf-8')
>>> 'http://zh.wikipedia.org/zh/\xc3\xa6\xc2\xb1\xc2\x89\xc3\xa8\xc2\xaf\xc2\xad'

我也尝试使用 :

str(a)

但我收到错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 27-32: ordinal not in range(128)

如何对其进行编码以删除 'u'?

顺便说一下,如果没有 'u' 我会得到正确的结果,如:

s = 'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
print s
>>> http://zh.wikipedia.org/zh/汉语

你有一个Mojibake;在这种情况下,这些是 UTF-8 字节解码,就好像它们是 Latin-1 字节一样。

要反转该过程,请再次编码为 Latin-1:

>>> a =  u'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
>>> a.encode('latin-1')
'http://zh.wikipedia.org/zh/\xe6\xb1\x89\xe8\xaf\xad'
>>> print a.encode('latin-1')
http://zh.wikipedia.org/zh/汉语

print 起作用是因为我的终端配置为处理 UTF-8。您可以通过解码为 UTF-8:

再次获得一个 unicode 对象
>>> a.encode('latin-1').decode('utf8')
u'http://zh.wikipedia.org/zh/\u6c49\u8bed'

ISO-8859-1 (Latin-1) 编解码器一对一映射到前 255 个 Unicode 代码点,这就是字符串内容看起来没有变化的原因。

您可能希望使用 ftfy library 来完成这些工作;它处理各种各样的文本问题,包括 Windows 代码页 Mojibake,其中某些结果 'codepoints' 无法合法地编码到代码页。 ftfy.fix_text() 函数接受 Unicode 输入并修复它:

>>> import ftfy
>>> ftfy.fix_text(a)
u'http://zh.wikipedia.org/zh/\u6c49\u8bed'