将unicode字符串转换为utf-8

问题描述 投票:0回答:3

首先,我知道在 Python 2.x 中存在大量有关字符串编码/解码的问题,但我似乎无法找到该问题的解决方案。

我有一个 unicode 字符串,其中包含字母

č
,表示为
\u00c4\u008d

如果在Python控制台中我写

>>> a = u"\u00c4\u008d"
>>> print a

我打印出两个奇怪的字符而不是

č
,可能是因为该字符串的实际编码应该是UTF-8。因此我尝试使用
.decode("utf-8")
但为此我得到了标准
UnicodeEncodeError

你知道我如何让 Python 在控制台中将该字符串打印为

č
吗?

非常感谢

python unicode encoding utf-8
3个回答
3
投票

č
不由
u'\u00c4\u008d'
表示。 这两个十六进制值是 UTF-8 编码值,因此应以字节字符串形式编写为
'\xc4\x8d'
。 示例:

>>> s = '\xc4\x8d'
>>> s.decode('utf8')
u'\u010d'
>>> print(s.decode('utf8'))
č

警告:您的终端必须配置支持正确打印字符的编码,否则您将看到

UnicodeEncodeError

如果由于某种原因您的 Unicode 字符串解码错误,您可以利用 Unicode 的前 256 个代码点与

latin1
编码相关的事实并修复它:

>>> s = u'\u00c4\u008d'
>>> s.encode('latin1')
'\xc4\x8d'
>>> s.encode('latin1').decode('utf8')
u'\u010d'
>>> print(s.encode('latin1').decode('utf8'))
č

如果您的 Unicode 字符串解码错误,您应该显示您拥有的文件或读取该文件的代码并解决该问题。


1
投票

在与 python 战斗了一个多小时后,我决定寻找另一种语言的解决方案。这就是我在 C# 中实现目标的方法:

var s = "\u00c4\u008d";
var newS = Encoding.UTF8.GetString(Encoding.Default.GetBytes(s));
File.WriteAllText(@"D:\tmp\test.txt", newS, Encoding.UTF8);

终于!该文件现在包含

č

因此,我受到 C# 中这种方法的启发,并设法在 Python 中提出以下(看似)等效的解决方案:

>>> s = u"\u00c4\u008d"
>>> arr = bytearray(map(ord, s))
>>> print arr.decode("utf-8")
č

我不确定这个解决方案有多好,但它似乎适用于我的情况。


0
投票

对于几年后在 Python3 中看到这个问题的人:

>>> s = b'\xc4\x8d'
>>> s.decode('utf8')
'č'
© www.soinside.com 2019 - 2024. All rights reserved.