UTF-8 编码未显示特殊字符 [duplicate]

UTF-8 Encoding is not showing special charachters [duplicate]

提问人:underloaded_operator 提问时间:8/15/2023 更新时间:8/15/2023 访问量:56

问:

问题:

我的 Python 函数遇到了一个问题,该函数从 CSV 文件中读取数据并将其转换为 JSON 格式。CSV 文件包含特殊的斯洛文尼亚字母,例如“č”、“š”、“ž”等。我使用 UTF-8 编码来读取和写入文件,据我所知,这些文件应该支持这些字符。但是,该函数似乎没有按照我想要的方式处理这些字符。它们在输出 JSON 文件中显示为 Unicode 转义序列。

以下是该函数的简化版本:

import csv
import json

def read_rail_nodes(_in_file: str, _out_file: str) -> None:
    json_objects = []
    with open(_in_file, 'r', encoding='utf-8') as file:
        csv_reader = csv.reader(file)
        next(csv_reader)
        for row in csv_reader:
            id, station_name, _, _ = row
            json_objects.append({'id': id, 'station_name': station_name})

    with open(_out_file, 'w', encoding='utf-8') as file:
        json.dump(json_objects, indent=4, fp=file)

    print("\n[rail_nodes.csv] data converted and saved to [", _out_file, "]\n")

read_rail_nodes('rail_nodes.csv', 'rail_nodes.json')

示例输入:

43002,Laško,46.15453611,15.23225833

输出示例:

    {
        "id": "43002",
        "station_name": "La\u0161ko"
    },

期望输出:

    {
        "id": "43002",
        "station_name": "Laško"
    },

我正在使用 VS Code,并且已经仔细检查了我的编码,它设置为 UTF-8,使用任何其他编码打开文件只会使情况变得更糟。.josn

我一直在考虑一个单一的潜在解决方案,尽管我对未来可能出现的潜在并发症持谨慎态度。在我看来,在读取.json文件时采用 UTF-8 编码可能是一种可行的补救措施。但是,在直观地呈现JSON数据时,我发现自己陷入了困境,因为我目前无法设计出合适的方法

我的代码中是否遗漏了某些内容,在处理具有 UTF-8 编码的文件时,我是否需要做一些特定的事情来正确支持特殊的斯洛文尼亚字母,或者我的双手是否被束缚?

任何帮助或指导将不胜感激!

其他信息:

Python 版本:3.11.3
操作系统:MacOS

python utf-8

评论

0赞 JohnyCapo 8/15/2023
我搜索了一些东西。它显示 unicode 编号,但一旦再次被 Python 读取,它就会显示为“š”。我在 Python 控制台中尝试过它,所以我相信它应该可以按照您的意愿工作。
0赞 underloaded_operator 8/15/2023
@JohnyCapo是的,我想到了。我倾向于用特殊字母一个接一个地手动替换代码。数据集不是太大,所以我认为它应该是可行的。
3赞 MegaIng 8/15/2023
JSON 标准不允许原始 UTF-8,因此 pythons 库可以正确地对其进行转义。所有适当的程序都将读取字符串并将转义序列转换为单个字符(无论这意味着什么)。
0赞 JohnyCapo 8/15/2023
没错,正如 Megalng 所说。
1赞 MegaIng 8/15/2023
如果您的 JSON 文件中有 UTF-8,其他程序可能会中断并且无法读取 JSON 文件(尽管不太可能,但并非不可能,例如稍旧的 python 版本(我认为低于 3.7?)不会默认为 UTF-8。

答:

4赞 Sarthak 8/15/2023 #1

你面临的问题不在于你的代码,而在于 Python 的函数如何转义 Unicode 字符。json.dump()

如果你想看到直接显示实际Unicode字符的JSON,你可以使用函数的参数,将其设置为false,JSON将使用实际的Unicode字符而不是转义序列来编写,例如:ensure_asciijson.dump()

json.dump(json_objects, indent=4, fp=file, ensure_ascii=False)