UnicodeDecodeError: кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается на < undefined >

Я бы предложил использовать System.Runtime.Serialization.Json, который является частью .NET 4.5.

[DataContract]
public class Foo
{
   [DataMember(Name = "data")]
   public Dictionary<string,string> Data { get; set; }
}

Затем используйте его следующим образом:

var serializer = new DataContractJsonSerializer(typeof(List<Foo>));
var jsonParams = @"{""data"": [{""Key"":""foo"",""Value"":""bar""}] }";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonParams));

var obj = serializer.ReadObject(stream);
Console.WriteLine(obj);
396
задан ZygD 7 March 2019 в 09:42
поделиться

2 ответа

Для тех, которые работают у Анаконды в Windows, у меня была та же проблема. Блокнот ++ помогает мне решить его.

Открывают файл в Блокноте ++. В нижнем правом это скажет Вам текущее кодирование файла. В главном меню, рядом с "Представлением" определяют местоположение "Кодирования". В "Кодировании" переходят к "наборам символов", и там с пациентом ищут enconding, в котором Вы нуждаетесь. В моем случае кодирование "Windows 1252" было найдено под "западноевропейцем"

1
ответ дан 22 November 2019 в 23:07
поделиться

TLDR? Попытка: file = open(filename, encoding='cp437)

, Почему? Когда одно использование:

file = open(filename)
text = file.read()

Python предполагает, что файл использует ту же кодовую страницу в качестве текущей среды (cp1252 в случае вводного сообщения) и пытается декодировать его к своему собственному UTF-8 по умолчанию. Если файл содержит символы значений, не определенных в этой кодовой странице (как 0x90), мы получаем UnicodeDecodeError. Иногда мы не знаем кодирование файла, иногда кодирование файла может быть не обработано Python (как, например, cp790), иногда файл может содержать смешанную кодировку.

, Если такие символы являются ненужными, можно решить заменить их вопросительными знаками, с:

file = open(filename, errors='replace')

Другое обходное решение должно использовать:

file = open(filename, errors='ignore')

символы затем оставляют неповрежденными, но другие ошибки будут замаскированы также.

Довольно хорошее решение состоит в том, чтобы указать кодирование, все же не любое кодирование (как cp1252), но тот, который имеет ВСЕ определенные символы (как cp437):

file = open(filename, encoding='cp437')

Кодовая страница 437 является исходным кодированием DOS. Все коды определяются, таким образом, нет никаких ошибок при чтении файла, никакие ошибки не кашируются, символы сохраняются (не совсем оставил неповрежденным, но все еще различимым).

1
ответ дан 22 November 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: