将 Python 转义的 unicode 序列转换为 UTF-8

Posted

技术标签:

【中文标题】将 Python 转义的 unicode 序列转换为 UTF-8【英文标题】:Convert Python escaped unicode sequences to UTF-8 【发布时间】:2018-02-15 05:45:50 【问题描述】:

所以我正在使用 BeautifulSoup。它让我得到了一些 html 节点的文本,但这些节点有一些 Unicode 字符,这些字符被转换为字符串中的转义序列

例如,一个具有以下内容的 HTML 元素: 50 € 由 BeautifulSoup 检索,例如: soup.find("h2").text 作为这个字符串:50\u20ac,它只能在 Python 控制台中读取。 但是当写入 JSON 文件时,它变得不可读。 注意:我使用以下代码保存到 json: with open('file.json', 'w') as fp: json.dump(fileToSave, fp) 如何将这些 Unicode 字符转换回 UTF-8 或任何使它们再次可读的东西?

【问题讨论】:

你试过了吗:f = open('somefile', 'wb') 然后 f.write('your text') 保存到 JSON 是什么意思?您是将 JSON 返回给其他函数还是将其写入文件? @chad 写入 JSON 文件。 提供minimal reproducible example。 如何将其保存为 JSON?显示字符串内容的repr() 【参考方案1】:

使用 Python 3 的小演示。如果您不使用 ensure_ascii=False 转储到 JSON,则非 ASCII 将使用 Unicode 转义码写入 JSON。这不会影响加载 JSON 的能力,但它在 .json 文件本身中的可读性较差。

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup
>>> html = '<element>50\u20ac</element'
>>> html
'<element>50€</element'
>>> soup = BeautifulSoup(html,'html')
>>> soup.find('element').text
'50€'
>>> import json
>>> with open('out.json','w',encoding='utf8') as f:
...  json.dump(soup.find('element').text,f,ensure_ascii=False)
...
>>> ^Z

out.json 的内容(UTF-8 编码):

"50€"

【讨论】:

非常感谢!那行得通,现在可以阅读了。但是如何正确加载它呢?现在我使用此代码加载文件: json1_file = open(filename + '.json') json1_str = json1_file.read() file = json.loads(json1_str) 但字符显示不正确。我无法在评论中正确嵌入代码,对此感到抱歉。 JSON 现在可以正确呈现,但是当加载回 Python 时,它是这样的:50€. @MohamedOun 使用encoding='utf8' 打开文件。这不是默认设置。【参考方案2】:

对于 Python 2.7,我认为您可以使用 codecsjson.dump(obj, fp, ensure_ascii=False)。示例:

import codecs
import json

with codecs.open(filename, 'w', encoding='utf-8') as fp:
    # obj is a 'unicode' which contains "50 €"
    json.dump(obj, fp, ensure_ascii=False)

【讨论】:

@MohamedOun 它在 Python3 中运行良好,但是你没有展示你做错了什么的例子,所以我们可以纠正它。 @MarkTolonen 我有一本字典,其中的值是具有 unicode 字符的字符串。我将该字典保存为 JSON 文件,但其中的 unicode 字符显示为 \u20ac。您需要更多详细信息吗?【参考方案3】:

请尝试以下:

utf8string = <unicodestring>.encode("utf-8")

【讨论】:

问题是,它返回的是一个字符串,而不是一个 unicode 字符串。无论如何,我尝试对该字符串进行编码,但我无法将其保存为 JSON,因为 Object of type 'bytes' is not JSON serializable.

以上是关于将 Python 转义的 unicode 序列转换为 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章

你能避免 Gson 将“<”和“>”转换为 unicode 转义序列吗?

使用 VB Script RegExp 对象将 '\uA90F' 形式的 JSON Unicode 转义序列转换为 XML 字符引用

在 Python 中将 Unicode URL 转换为 ASCII(UTF-8 百分比转义)的最佳方法?

如何将 unicode 字符串转换为其 unicode 转义?

Unicode 转义序列

PyQt5 unicode 翻译:pylupdate5 输出转义序列