Windows, кажется, вставляет дополнительные байты в строку Python - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь прочитать текстовый файл .json в Windows, который содержит различные строки, одна из которых содержит символ Unicode «оператор точки» U + 22C5.Он отлично работает на моей удаленной машине с Ubuntu 18.04.Однако, когда я читаю файл JSON на компьютере с Windows, символ 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'

Кажется, что Windows изменяет байткод файла JSON при его чтении. Я открыл файл JSON в Блокноте в Windows, чтобы увидеть, интерпретируется ли исходный файл по-разному на компьютере с Windows, но это не так: оператор точки отображается правильно при просмотре в Блокноте.

Кто-нибудь знает, почему это так?В частности, почему при чтении символов юникода на машине linux генерируется другой байт-код python, чем при чтении тех же символов на машине Windows?

Кроме того, как я могу предотвратить это?Поскольку этот один символ является особым случаем, я мог бы исправить его, используя метод replace, чтобы поменять символы, но это кажется хакерским.Я бы хотел просто предотвратить эту проблему.

1 Ответ

0 голосов
/ 07 июня 2019

Кажется, что я могу решить проблему, используя опцию encoding='utf-8', когда открываю файл перед загрузкой в ​​загрузчик json. т.е.

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

Проблема решена.

...