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

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


在Python 2中

>>> 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并指定编码。

Python 3

所有字符串都是unicode。unicode函数不再存在。参见@本体的回答


如果我理解正确的话,您的代码中有一个utf-8编码的字节字符串。

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

可以通过使用unicode函数或decode方法来实现。:

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

Or:

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

如果上面的方法不起作用,你也可以告诉Python忽略字符串中不能转换为utf-8的部分:

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

在.py文件的顶部添加以下一行:

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

允许你在脚本中直接编码字符串,就像这样:

utfstr = "ボールト"

可能有点过度,但当我在相同的文件中使用ascii和unicode时,重复解码可能是一种痛苦,这就是我使用的:

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

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

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

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

使用ord()和unichar()进行翻译。 每个unicode字符都有一个相关联的数字,类似于索引。Python有几个方法可以在char和number之间转换。缺点是一个ñ的例子。希望能有所帮助。

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

是的,你可以添加

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

在源代码的第一行。

你可以在这里阅读更多细节https://www.python.org/dev/peps/pep-0263/


首先,Python中的str是用Unicode表示的。 其次,UTF-8是将Unicode字符串编码为字节的编码标准。有很多编码标准(例如UTF-16、ASCII、SHIFT-JIS等)。

当客户端使用UTF-8向服务器发送数据时,他们发送的是一堆字节,而不是str。

你收到一个str,因为“库”或“框架”,你正在使用,已经隐式转换一些随机字节到str。

在底层,只有一堆字节。你只需要要求“库”以字节为单位给你请求内容,你将自己处理解码(如果库不能给你,那么它是试图做黑魔法,那么你不应该使用它)。

解码UTF-8编码字节到str: bs.decode(' UTF-8 ') 编码str到UTF-8字节:s.encode(' UTF-8 ')


你还可以这样做:

from unidecode import unidecode
unidecode(yourStringtoDecode)

你可以使用python的标准库编解码器模块。

import codecs
codecs.decode(b'Decode me', 'utf-8')

url被翻译成ASCII码,而对Python服务器来说,它只是一个Unicode字符串,例如: “T % C3%A9st % C3%A3o”

Python将“é”和“ã”理解为实际的%C3%A9和%C3%A3。

你可以像这样编码URL:

import urllib
url = "T%C3%A9st%C3%A3o"
print(urllib.parse.unquote(url))
>> Téstão

详情见https://www.adamsmith.haus/python/answers/how-to-decode-a-utf-8-url-in-python。