将 Unicode 字符串转换为 Python 中的字符串(包含额外符号)
Posted
技术标签:
【中文标题】将 Unicode 字符串转换为 Python 中的字符串(包含额外符号)【英文标题】:Convert a Unicode string to a string in Python (containing extra symbols) 【发布时间】:2010-11-15 12:00:39 【问题描述】:如何将 Unicode 字符串(包含额外字符,如 £ $ 等)转换为 Python 字符串?
【问题讨论】:
我们需要知道您使用的 Python 版本,以及您调用的 Unicode 字符串是什么。在包含引起麻烦的货币符号的简短 unicode_string 上执行以下操作: Python 2.x :print type(unicode_string), repr(unicode_string)
Python 3.x :print type(unicode_string), ascii(unicode_string)
然后编辑您的问题并复制/粘贴上述打印语句的结果。不要重新输入结果。还要查看 html 顶部附近的内容,看看是否可以找到类似这样的内容:
我怀疑你从网络请求中获得了 unicode。你可能会得到 UTF-8 编码的 Unicode。
@lutz:“UTF-8 编码的 Unicode”到底是不是 unicode?span>
您应该真正阐明 unicode string 和 python string 的含义(我猜最好给出具体示例),因为从cmets对你的问题有不同的解释。我想知道你为什么没有这样做,尽管你问这个问题已经超过 3.5 年了。
@jalf: 如果是encoded;它不再是 Unicode,例如 unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
【参考方案1】:
有一个名为 ftfy 的库可以帮助解决 Unicode 问题。让我的生活更轻松。
示例 1
import ftfy
print(ftfy.fix_text('ünicode'))
output -->
ünicode
示例 2 - UTF-8
import ftfy
print(ftfy.fix_text('\xe2\x80\xa2'))
output -->
•
示例 3 - Unicode 代码点
import ftfy
print(ftfy.fix_text(u'\u2026'))
output -->
…
https://ftfy.readthedocs.io/en/latest/
pip install ftfy
https://pypi.org/project/ftfy/
【讨论】:
【参考方案2】:见unicodedata.normalize
title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
'Kluft skrams infor pa federal electoral groe'
【讨论】:
+1 按措辞回答问题,@williamtroup 无法将 unicode 保存到文件的问题听起来像是一个完全不同的问题,值得单独提出一个问题 @John - 这个答案早于 OP 的澄清。 @Mark Roddy:他写的问题是如何将包含一些货币符号的“Unicode 字符串”(无论他的意思)转换为“Python 字符串”(无论......),而你认为 remove-some-diacritics delete-other-non-ascii characters kludge 回答了他的问题??? @JohnMachin 这逐字回答了问题:only 将unicode
字符串转换为str
的方法是删除或转换不能用 ASCII 表示。所以我要 +1。
@lzkata:不,不是。 type(title) == unicode and type(title.encode('utf-8')) == str
。无需破坏输入,即可获得可以保存到文件中的字节串。【参考方案3】:
文件包含 unicode-esaped 字符串
\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",
对我来说
f = open("56ad62-json.log", encoding="utf-8")
qq=f.readline()
print(qq)
"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"
(qq.encode().decode("unicode-escape").encode().decode("unicode-escape"))
# '"log":"message": "Авторизация пользователя"\n'
【讨论】:
即使我只使用它也有效:result.encode().decode('unicode-escape')
【参考方案4】:
没有答案适用于我的情况,我有一个包含 unicode 字符的字符串变量,并且这里解释的编码解码没有工作。
如果我在终端中这样做
echo "no me llama mucho la atenci\u00f3n"
或
python3
>>> print("no me llama mucho la atenci\u00f3n")
输出正确:
output: no me llama mucho la atención
但使用加载此字符串变量的脚本不起作用。
这对我的案子有效,以防万一:
string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención
【讨论】:
你需要导入json【参考方案5】:>>> text=u'abcd'
>>> str(text)
'abcd'
如果字符串只包含ascii字符。
【讨论】:
这仅适用于 Windows。如果有非 ascii 符号,则会中断。 如果字符串的内容实际上是 unicode,而不仅仅是 unicode 字符串中的 ascii 字符,则会中断。不要这样做,你会得到随机的 UnicodeEncodeError 异常。 这个答案对我有帮助。如果您知道您的字符串是 ascii 并且需要将其转换回非 unicode 字符串,这非常有用。【参考方案6】:这是一个示例代码
import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
【讨论】:
这个答案与接受的答案有何不同?【参考方案7】:如果不需要翻译非 ASCII 字符,可以使用 encode to ASCII:
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
【讨论】:
很棒的答案。正是我需要的。此外,展示ignore
与replace
效果的精彩演示
或a.encode('ascii', 'xmlcharrefreplace')
给出'aaa&#224;&#231;&#231;&#231;&#241;&#241;&#241;'
。
type(a)
在 Python 3.6.8 中是 str
并且没有任何 encode()
方法。
python 语句:a.encode('ascii','ignore') 结果:b'aaa'【参考方案8】:
如果您有一个 Unicode 字符串,并且想要将其写入文件或其他序列化形式,您必须首先将其 编码 为可以存储的特定表示。有几种常见的 Unicode 编码,例如 UTF-16(对大多数 Unicode 字符使用两个字节)或 UTF-8(1-4 个字节/代码点,具体取决于字符)等。要将字符串转换为特定编码,您可以使用:
>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'
这个原始的字节串可以写入文件。但是,请注意,在读回它时,您必须知道它的编码并使用相同的编码对其进行解码。
写入文件时,您可以使用codecs 模块摆脱这种手动编码/解码过程。因此,要打开将所有 Unicode 字符串编码为 UTF-8 的文件,请使用:
import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string) # Stored on disk as UTF-8
请注意,使用这些文件的任何其他人都必须了解文件的编码方式才能读取它们。如果你是唯一一个做读/写的人,这不是问题,否则请确保你以任何其他使用文件的人都可以理解的形式编写。
在 Python 3 中,这种形式的文件访问是默认的,内置的 open
函数将采用编码参数,并始终为打开的文件转换为 Unicode 字符串(Python 3 中的默认字符串对象)。在文本模式下。
【讨论】:
【参考方案9】:好吧,如果您愿意/准备好切换到 Python 3(您可能不是因为与某些 Python 2 代码向后不兼容),您不必进行任何转换; Python 3 中的所有文本都用 Unicode 字符串表示,这也意味着不再使用 u'<text>'
语法。实际上,您还拥有用于表示数据的字节字符串(可能是编码字符串)。
http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
(当然,如果您当前使用的是 Python 3,那么问题可能与您尝试将文本保存到文件的方式有关。)
【讨论】:
在 Python 3 中,字符串是 Unicode 字符串。它们永远不会被编码。我发现以下文本很有用:joelonsoftware.com/articles/Unicode.html 他想把它保存到一个文件中;您的回答对此有何帮助? @lutz:是的,我忘记了 Unicode 是字符映射而不是编码。 @John:目前没有足够的信息来知道保存它的问题是什么。他有错误吗?他没有收到任何错误,但是在外部打开文件时,他得到了 mojibake?如果没有这些信息,就可以提供太多可能的解决方案。 @Cat:目前没有任何信息可以知道他有什么,更不用说他的储蓄问题了。我已请他提供一些事实——请参阅我的回答。【参考方案10】:这是一个例子:
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
【讨论】:
谁能解释为什么,当我将欧元符号编码为utf8
时,结果只是问号?这是我的 Python 版本 2.7.13 的an image。 (我可以编码其他 unicode 对象,如 u"Klüft"
,但不能编码欧元?)以上是关于将 Unicode 字符串转换为 Python 中的字符串(包含额外符号)的主要内容,如果未能解决你的问题,请参考以下文章
有效地将字符串转换为 python 2.7 的 unicode
将 Python 转义的 unicode 序列转换为 UTF-8
将 Unicode 字符串转换为 Python 中的字符串(包含额外符号)