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

Posted

技术标签:

【中文标题】如何在 Python 中将字符串转换为 utf-8【英文标题】:How to convert a string to utf-8 in Python 【发布时间】:2011-05-10 02:48:03 【问题描述】:

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

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

【问题讨论】:

试试这个链接http://evanjones.ca/python-utf8.html 我认为更好的标题是如何在不翻译的情况下将字符串强制转换为 unicode?​​b> 在 2018 年,python 3 如果你得到 ascii 解码错误,请执行 "some_string".encode('utf-8').decode('utf-8') 【参考方案1】:

在 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 的回答

【讨论】:

,我收到以下错误:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byte 这是我的代码:ret=[] for line in csvReader: cline=[] for elm in line: unicodestr = unicode(elm, 'utf -8') cline.append(unicodestr) ret.append(cline) 这一切都不适用于 Python 3,所有字符串都是 unicode 且 unicode() 不存在。 如何将u 转换回str 格式(将u 转换回s)? 此代码仅在文本不包含非 ascii 字符时才有效;字符串上的简单重音字符将使其失败。 您好,如果您在字符串变量中有"2340",并且您想打印Unicode 字符U+2340 (⍀),有什么办法吗?【参考方案2】:

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

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

【讨论】:

Got AttributeError: 'str' object has no attribute 'decode' @saran3h 听起来您使用的是 Python 3,在这种情况下,Python 应该 为您处理编码问题。您是否尝试过在不指定编码的情况下阅读文档? Python 默认选择系统编码。在 Windows 10 中,它是 cp1252,它与 utf-8 不同。我在 py 3.8 中使用 codecs.open() 时浪费了几个小时【参考方案3】:

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

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

【讨论】:

这不再起作用,正如所写...unicode 类型在 python3 中不存在【参考方案4】:

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

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

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

utfstr = "ボールト"

【讨论】:

这不是 OP 所要求的。但无论如何都要避免这种字符串文字。它在 Python 3 中创建 Unicode 字符串(好),但它在 Python 2 中是字节字符串(坏)。在顶部添加 from __future__ import unicode_literals 或使用 u'' 前缀。不要在 bytes 文字中使用非 ascii 字符。要获取 utf-8 字节,如果需要,您可以稍后 utf8bytes = unicode_text.encode('utf-8') @jfs from __future__ import unicode_literals 将如何帮助我将非 ascii 字符的字符串转换为 utf-8? @OrtalTurgeman 我没有回答这个问题。看,这是评论,而不是答案。我的评论解决了答案中代码的问题。它尝试在 Python 2 上创建一个带有非 ascii 字符的字节串(在 Python 3 上它是一个 SyntaxError — 字节文字禁止这样做)。【参考方案5】:

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

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

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

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

或者:

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

【讨论】:

【参考方案6】:
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

使用 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')
ñ

【讨论】:

【参考方案9】: 首先,Python 中的str 表示为Unicode。 其次,UTF-8是一种编码标准,将Unicode字符串编码为bytes。那里有许多编码标准(例如UTF-16ASCIISHIFT-JIS 等)。

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

您收到str 是因为您使用的“库”或“框架”已将一些随机的bytes 隐式转换为str

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

解码UTF-8 编码bytesstr: bs.decode('utf-8')str编码为UTF-8bytes:s.encode('utf-8')

【讨论】:

【参考方案10】:

你也可以这样做:

from unidecode import unidecode
unidecode(yourStringtoDecode)

【讨论】:

什么是unidecode?是pypi.org/project/Unidecode吗?如果它是第 3 方包,请提供信息,以及如何安装/使用它。【参考方案11】:

可以使用python的标准库codecs module。

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

【讨论】:

【参考方案12】:

是的,你可以添加

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

在源代码的第一行。

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

【讨论】:

以上是关于如何在 Python 中将字符串转换为 utf-8的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中将字符串转换为 UTF-8?

如何在 C# 中将字符串转换为 UTF-8?

如何在C#中将字符串转换为UTF-8?

如何在Dart中将UTF-8字符串转换为字节数组?

在 Java 中将 UTF-8 转换为 ISO-8859-1 - 如何将其保持为单字节

QT中将gbk字符转换为utf-8字符