c# Кодирование MemoryStream по сравнению с кодированием. Кодирование.ПолучитьЧарс()

Я пытаюсь скопировать поток байтов из базы данных, закодировать его и, наконец, отобразить на веб-странице. Однако я замечаю различное поведение, кодирующее содержимое по-разному (примечание: я использую «западноевропейскую» кодировку, которая имеет набор латинских символов и не поддерживает китайские символы):

var encoding = Encoding.GetEncoding(1252 /*Western European*/);
using (var fileStream = new StreamReader(new MemoryStream(content), encoding))
{
    var str = fileStream.ReadToEnd();
}

Vs.

var encoding = Encoding.GetEncoding(1252 /*Western European*/);
var str = new string(encoding.GetChars(content));

Если содержимое содержит китайские иероглифы, то первый блок кода создаст строку типа «D$教学而设计的», что неверно, поскольку кодировка не должна поддерживать эти символы, а второй блок выдаст «D$æ• ™å¦è€Œè®¾è®¡çš„", что является правильным, поскольку все они находятся в западноевропейском наборе символов.

Чем объясняется такая разница в поведении?


person Sidawy    schedule 02.11.2012    source источник


Ответы (1)


Конструктор StreamReader будет искать спецификации в потоке и устанавливать из них свою кодировку, даже если вы передадите другую кодировку.

Он видит спецификацию UTF8 в ваших данных и правильно использует UTF8.

Чтобы предотвратить такое поведение, передайте false в качестве третьего параметра:

var fileStream = new StreamReader(new MemoryStream(content), encoding, false)
person SLaks    schedule 02.11.2012
comment
Спасибо! теперь они производят одну и ту же строку. Из любопытства, какой блок кода вы предлагаете лучше использовать? Есть ли преимущества или недостатки того и другого? - person Sidawy; 02.11.2012