【问题标题】:Windows seems to insert additional bytes into python strWindows 似乎在 python str 中插入了额外的字节
【发布时间】:2019-10-22 11:57:10
【问题描述】:

我正在尝试在 Windows 上读取包含各种字符串的 .json 文本文件,其中一个包含“点运算符”unicode 字符 U+22C5。它在我的远程 Ubuntu 18.04 机器上运行良好。但是,当我在 Windows 机器上读取 JSON 文件时,unicode 字符会被损坏。

JSON 文本文件的内容如下:

"Nm": {
    "Value": 1,
    "Symbol": "N⋅m"
}

但是,在我使用 python JSON 模块加载文件后,它在我的 python 字典中显示如下(但仅在 Windows 上):

"Nm": {
    "Value": 1,
    "Symbol": "Nâ‹…m"
}

注意点运算符是如何变成别的东西的。

我将生成的两个字符串转换为字节码进行比较。

Ubuntu 上的字节码:

>>> bytes("N⋅m", "utf-8")
>   b'N\xe2\x8b\x85m'

Windows 上的字节码:

>>> bytes("N‹…m", "utf-8")
>   b'N\xc3\xa2\xe2\x80\xb9\xe2\x80\xa6m'

在读取 JSON 文件时,Windows 似乎正在更改它的字节码。我在 Windows 上的记事本中打开了 JSON 文件,以查看源文件在 Windows 机器上的解释是否不同,但不是:在记事本中查看时,点运算符正确显示。

有谁知道这是为什么?具体来说,为什么在 linux 机器上读取 unicode 字符时生成的 python 字节码与在 Windows 机器上读取相同字符时不同?

另外,我怎样才能防止这种情况发生?由于这个字符是一种特殊情况,我可以通过使用replace 方法来换出字符来修复它,但这似乎很麻烦。我想首先防止这个问题。

【问题讨论】:

    标签: python python-3.x windows non-ascii-characters python-unicode


    【解决方案1】:

    在将文件加载到 json 加载器之前打开文件时,我似乎可以通过使用 encoding='utf-8' 选项来解决此问题。即

    with open(filename, 'r', encoding='utf-8') as json_unit_definitions:
        units_environment = json.load(json_unit_definitions)
    

    问题解决了。

    【讨论】:

    • open 的文档声明“默认编码取决于平台(无论 locale.getpreferredencoding() 返回什么)”。在 Windows 中,后者默认为系统区域设置编码“mbcs”。在 Windows 10 中,系统区域设置可以配置为使用 UTF-8。
    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多