如何使用Python3创建Unicode字符串

123

我使用了以下代码:

u = unicode(text, 'utf-8')

但是在 Python 3 中出现错误(或者可能我忘记包含某些内容):

NameError: global name 'unicode' is not defined

谢谢。


18
如果有一个很棒的升级到 Python 3 的理由,那就是默认支持 Unicode。 - JBernardo
text.encode('unicode_escape')应该就足够了。 - Ritwik
5个回答

166

在Python3中,字面字符串默认为Unicode。

假设text是一个bytes对象,只需使用text.decode('utf-8')即可。

Python2中的unicode与Python3中的str相当,因此您也可以写成:

str(text, 'utf-8')

如果你喜欢的话。


71
类型错误:不支持解码字符串。 - Gank
13
在Python3中,str是Unicode,也就是说它已经被“解码”,因此调用decode没有意义。 - John La Rooy
1
相同的 TypeError。请只用 str(txt) 替换,或使用下面 @magicrebirth 的代码 - Simon
6
原始样本不清晰。因此,在Python3中,如果您想执行str(text, 'utf-8'),则text必须是一个字符串二进制类型。例如:str(b'this is a binary', 'utf-8') - killua8p

12

1
这正是我们在 Python 2 中对 '\x80abc' 进行解码所需要的,谢谢。 - http8086

9

作为解决方案,我一直在使用以下方法:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)

12
为什么要使用lambda函数?这些方法在任何情况下都是以相同的方式调用。以下是更简单的变化:try: unicode = str; except: pass. - nicbou
1
似乎你可以直接使用unicode = str,因为它在2或3中都不会失败。 - Nickolai
1
或者使用 from six import u as unicode 更好,因为它更易于自我说明(因为six是一个2/3兼容层),而不是使用 unicode = str - Nickolai

5
这是我解决转换类似于\uFE0F,\u000A等字符以及使用16字节编码表述的表情符号问题的方法。
example = 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\\uD83D\\uDE0D\\uD83D\\uDE0D\\u2764\\uFE0F Present Moment Caf\\u00E8 in St.Augustine\\u2764\\uFE0F\\u2764\\uFE0F '
import codecs
new_str = codecs.unicode_escape_decode(example)[0]
print(new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\ud83d\ude0d\ud83d\ude0d❤️ Present Moment Cafè in St.Augustine❤️❤️ '
new_new_str = new_str.encode('utf-16', errors='surrogatepass').decode('utf-16')
print(new_new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream❤️ Present Moment Cafè in St.Augustine❤️❤️ '

有关“surrogatepass”的更多信息,请参见https://docs.python.org/3/library/codecs.html# error-handlers - Oskar Austegard

-1
在我使用多年的 Python 2 程序中,有这样一行代码:
ocd[i].namn=unicode(a[:b], 'utf-8')

在 Python 3 中,这行代码无法正常工作。

然而,经过调试后,发现程序可以使用以下方法实现:

ocd[i].namn=a[:b]

我不记得为什么一开始要放Unicode,但我想可能是因为名称中包含瑞典字母åäöÅÄÖ。但即使没有"unicode",它们也可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接