gpt4 book ai didi

Python 和 fql : getting "Dami\u00e1n" instead of "Damián"

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:58 25 4
gpt4 key购买 nike

我创建了一个包含字典的文件,其中包含用西类牙语编写的数据(即 Damián 等):

fileNameX.write(json.dumps(dictionaryX, indent=4))

数据来自一些fql抓取操作,即:

select name from user where uid in XXX

当我打开文件时,我发现,例如,“Damián”看起来像“Dami\u00e1n”。我尝试了一些选项:

  1. ensure_ascii=假:

    fileNameX.write(json.dumps(dictionaryX, indent=4, ensure_ascii=False))

    但我得到一个错误(UnicodeEncodeError:'ascii' 编解码器无法编码位置 XXX 中的字符 u'\xe1':序号不在范围内(128))。

  2. 编码(encoding='latin-1):

    dictionaryX.append({
    'name': unicodeVar.encode(encoding='latin-1'),
    ...
    })

    但我收到另一个错误(UnicodeDecodeError:'utf8' 编解码器无法解码位置 XXX 中的字节 0xe1:无效连续字节)

总而言之,我尝试了几种可能性,但没有任何线索。我迷路了。拜托,我需要帮助。谢谢!

最佳答案

您有很多选择,并且偶然发现了一些相当复杂的东西,这取决于您的 Python 版本,并且您绝对必须完全理解才能编写正确的代码。通常 3.x 中采用的方法更严格并且更难使用,但是您犯错或陷入复杂情况的可能性要小得多。 (根据您报告的确切症状,您似乎使用的是 2.x。)

json.dumps 在 2.x 和 3.x 中有不同的行为。在 2.x 中,它产生一个 str,这是一个字节串(未知编码)。在 3.x 中,它仍然生成一个 str,但现在 str 在 3.x 中是一个正确的 Unicode 字符串。

JSON 本质上是一种支持 Unicode 的格式,但它希望文件采用 UTF-8 编码。但是,请理解 JSON 支持字符串中的 \u 样式转义。当您读入这些数据时,您将得到正确的编码字符串。读取代码在从 JSON 中读取字符串时会生成 unicode 对象(无论您使用 2.x 还是 3.x)。

When I open the file, I find that, for instance, "Damián" looks like "Dami\u00e1n"

á 不能用 ASCII 表示。默认情况下,它被编码为 \u00e1,以避免您遇到的其他问题。即使在 3.x 中也会发生这种情况。

ensure_ascii=False

这会禁用之前的编码。在 2.x 中,这意味着您得到一个 unicode 对象 - 一个真正的 Unicode 对象,保留原始 á 字符。在 3.x 中,这意味着该字符未明确翻译。但无论哪种方式,ensure_ascii=False 都意味着 json.dumps 会给你一个 Unicode 字符串

Unicode 字符串必须经过编码才能写入文件。没有“unicode 数据”这样的东西; Unicode 是一种抽象。在 2.x 中,当您将 Unicode 对象提供给 file.write 时,此编码隐式为 'ascii';它期待一个 str。要解决这个问题,您可以使用 codecs 模块,或者在写入之前显式编码为 'utf-8'。在 3.x 中,编码是在您打开 文件时使用 encoding 关键字参数设置的(默认值可能也不是您想要的)。

encode(encoding='latin-1')

在这里,您在生成字典之前进行了编码,因此您的数据中有一个 str 对象。现在出现了一个问题,因为当您的数据中有 str 对象时,JSON 编码器默认假定它们代表 Unicode 字符串在 UTF-8 编码。这可以在 2.x 中更改,使用 json.dumpsencoding 关键字参数。 (在 3.x 中,编码器将简单地拒绝序列化 bytes 对象,即非 Unicode 字符串!)


但是,如果您的目标只是将数据直接获取到文件中,那么 json.dumps 是不适合您的工具。您是否想知道名称中的 s 是做什么用的?它代表“字符串”;这是特例。普通的情况,其实就是直接写入文件! (而不是给你一个字符串并期望你自己写它。)这就是 json.dump(没有's')所做的。同样,JSON 标准需要 UTF-8 编码,并且 2.x 有一个默认为 UTF-8 的 encoding 关键字参数(您应该保留它)。

关于Python 和 fql : getting "Dami\u00e1n" instead of "Damián",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12450869/

25 4 0