225

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

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

4

12 回答 12

297

在 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功能不再存在。请参阅@Noumenon 的回答

于 2010-11-15T08:31:41.483 回答
79

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

stringnamehere.decode('utf-8', 'ignore')
于 2013-10-07T17:00:57.290 回答
24

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

def make_unicode(inp):
    if type(inp) != unicode:
        inp =  inp.decode('utf-8')
    return inp
于 2014-11-29T19:13:33.223 回答
16

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

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

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

utfstr = "ボールト"
于 2014-05-22T15:15:40.440 回答
13

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

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

您可以使用unicode函数或decode方法来做到这一点。任何一个:

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

或者:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")
于 2010-11-15T08:55:26.287 回答
12
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
于 2017-07-26T20:31:44.560 回答
9

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

my_str = "\u221a25"
print(my_str)
>>> √25
于 2017-04-20T15:53:45.720 回答
5

使用 ord() 和 unichar() 进行翻译。每个 unicode 字符都有一个关联的数字,类似于索引。所以 Python 有一些方法可以在字符和他的数字之间进行转换。Downside 是一个例子。希望它可以提供帮助。

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ
于 2017-11-09T17:24:57.297 回答
4
  • 首先,str在 Python 中以Unicode.
  • 其次,是将字符串UTF-8编码为. 那里有许多编码标准(例如、、等)。UnicodebytesUTF-16ASCIISHIFT-JIS

当客户端将数据发送到您的服务器并且他们正在使用UTF-8时,他们正在发送一堆bytes未发送的数据str

您收到 a 是str因为您正在使用的“库”或“框架”已将一些随机数隐式转换bytesstr.

在引擎盖下,只有一堆bytes. 您只需要让“库”为您提供请求内容bytes,您将自己处理解码(如果库不能给您,那么它正在尝试做黑魔法,那么您不应该使用它)。

  • 解码UTF-8编码bytesstrbs.decode('utf-8')
  • 编码strUTF-8 bytess.encode('utf-8')
于 2020-08-07T00:11:01.483 回答
0

你也可以这样做:

from unidecode import unidecode
unidecode(yourStringtoDecode)
于 2021-07-19T16:25:54.133 回答
0

您可以使用 python 的标准库codecs模块

import codecs
codecs.decode(b'Decode me', 'utf-8')
于 2021-09-20T22:26:23.293 回答
-1

是的,您可以添加

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

在源代码的第一行。

您可以在此处阅读更多详细信息https://www.python.org/dev/peps/pep-0263/

于 2020-04-26T11:05:48.093 回答