如何在Python中将字符串转换为utf-8


192

我有一个将utf-8字符发送到我的Python服务器的浏览器,但是当我从查询字符串中检索到它时,Python返回的编码是ASCII。如何将纯字符串转换为utf-8?

注意:从网络传递的字符串已经是UTF-8编码的,我只想让Python将其视为UTF-8而不是ASCII。



我认为更好的标题是如何在不进行翻译的情况下将字符串强制转换为unicode?
boatcoder

1
在2018年,python 3如果您遇到ascii解码错误,请执行"some_string".encode('utf-8').decode('utf-8')
devssh

Answers:


265
>>> plain_string = "Hi!"
>>> unicode_string = u"Hi!"
>>> type(plain_string), type(unicode_string)
(<type 'str'>, <type 'unicode'>)

^这是字节字符串(plain_string)和unicode字符串之间的差异。

>>> s = "Hello!"
>>> u = unicode(s, "utf-8")

^转换为unicode并指定编码。


34
,我收到以下错误:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byte这是我的代码:ret = [] for csvReader中的行:cline = [] for elm in line:unicodestr = unicode(elm,'utf-8')cline.append(unicodestr)ret .append(cline)
Gopakumar NG

101
所有这些都不适用于Python 3,所有字符串都是unicode unicode()且不存在。
Noumenon 2015年

有点撞撞,但谢谢。这解决了我尝试打印unicode并得到提示的问题。
智障的人2016年

如何转换ustr格式(转换us)?
Tanguy

3
仅当文本不包含非ASCII字符时,此代码才有效。字符串上带有简单重音符号的字符将使其失败。
Haroldo_OK

71

如果上述方法不起作用,您还可以告诉Python忽略无法转换为utf-8的字符串部分:

stringnamehere.decode('utf-8', 'ignore')

6
得到了AttributeError:'str'对象没有属性'
decode'– saran3h

2
@ saran3h听起来您正在使用Python 3,在这种情况下,Python 应该为您处理编码问题。您是否尝试在未指定编码的情况下阅读文档?
duhaime '18年

21

可能有些矫kill过正,但是当我在同一文件中使用ascii和unicode时,重复解码可能会很痛苦,这就是我使用的方法:

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
    return input

15

将以下行添加到.py文件的顶部:

# -*- coding: utf-8 -*-

允许您直接在脚本中编码字符串,如下所示:

utfstr = "ボールト"

1
这不是OP要求的。但是无论如何都要避免这样的字符串文字。它在Python 3中创建Unicode字符串(良好),但在Python 2中创建一个字节字符串(不良)。from __future__ import unicode_literals在顶部添加或使用u''前缀。不要在bytes文字中使用非ASCII字符。要获取utf-8字节,utf8bytes = unicode_text.encode('utf-8')以后可以根据需要获取。
jfs

1
@jfs如何 from __future__ import unicode_literals帮助我将具有非ascii字符的字符串转换为utf-8?
Ortal Turgeman

@OrtalTurgeman我没有回答这个问题。看,这是评论,不是答案。我的评论使用答案中的代码解决了这个问题。它尝试在Python 2上创建一个带有非ascii字符的字节串(这在Python 3上是一个SyntaxError-字节字面量禁止这样做)。
jfs

13

如果我理解正确,则您的代码中包含utf-8编码的字节字符串。

将字节字符串转换为unicode字符串称为解码(unicode->字节字符串正在编码)。

您可以通过使用unicode函数或解码方法来实现。要么:

unicodestr = unicode(bytestr, encoding)
unicodestr = unicode(bytestr, "utf-8")

要么:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")

10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')

8

在Python 3.6中,它们没有内置的unicode()方法。默认情况下,字符串已经存储为unicode,并且不需要转换。例:

my_str = "\u221a25"
print(my_str)
>>> 25

3

使用ord()和unichar()进行翻译。每个Unicode字符都有一个关联的数字,如索引。因此,Python有一些方法可以在char和他的数字之间进行转换。缺点是一个例子。希望能有所帮助。

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.