Python UnicodeDecodeError: кодек «utf8» не может декодировать байт - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь создать файл C ++, закодированный в UTF-8. На самом деле, когда я пытаюсь создать такой файл:

#include <fstream>
#include <iostream>

int main() {
    std::ofstream myfile("test.json");
    myfile << "{\"test\":\"é\"}";
    myfile.close();
}

, тогда python не может декодировать его как UTF-8, и мне нужно декодировать его, используя ISO-8859-1:

import json
import codecs

with codecs.open('test.json', encoding='ISO-8859-1') as json_file:
    data = json.load(json_file)
print(data)

И когда я устанавливаю кодировку в utf8, я получаю ошибку:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 0: unexpected end of data

Как я могу сделать этот файл UTF-8, закодированный с использованием C ++? Мне действительно нужно, чтобы этот файл был UTF-8, а не ISO-8859-1.

Я также попытался создать JSON с помощью Vim (без использования C ++), и он работал.

1 Ответ

0 голосов
/ 28 октября 2019

Вам необходимо настроить ваш текстовый редактор / IDE.

C ++ просто записывает байты в выходной файл, и эти байты принимают форму текста, который вы пишете в исходном коде (поскольку данные являютсястроковый литерал). Таким образом, они имеют кодировку, указанную вашим текстовым редактором / IDE. Убедитесь, что установлено значение UTF-8.

В настоящее время ваш редактор, похоже, настроен на запись какой-либо другой кодировки. Затем, при попытке декодировать кодовые точки UTF-8 из результата, скрипт Python обнаруживает что-то другое и сообщает вам об этом.

То, что ваше решение работало, когда вы меняли редакторы на Vim, поддерживает это.

В качестве альтернативы вы можете сделать его строковым литералом UTF-8 (u8"é"). Это должно вызвать внутреннюю перекодировку, если исходный файл не был UTF-8, хотя я не уверен в том, насколько надежно это работает в современной экосистеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...