Странное поведение UTF8 GetBytes () с не-ascii символами - PullRequest
0 голосов
/ 13 марта 2012

Кто-нибудь может увидеть разницу между этими двумя блоками кода?

1

Byte[] arInput = Encoding.UTF8.GetBytes(sInput);

2

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); 
Byte[] arInput = UTF8.GetBytes(sInput);

После этого я записываю arInput в System.IO.Stream и отправляю Stream в HttpWebRequest на удаленный сервер.

По какой-то причине, когда я передаю не ssii символы в sInput, сервер возвращает ошибку 500, когда я использую первый пакет кода, но он отлично работает со вторым. Я пытался передать true и false в конструктор UTF8Encoding (), но ничего не изменилось.

1 Ответ

1 голос
/ 13 марта 2012

Единственная разница между Encoding.UTF8 и new UTF8Encoding() заключается в том, что для первого активирована спецификация, но только имеет значение, если вызывается GetPreamble(), поэтому при вызове GetBytes() точно без разницы.

Я бы предложил вам обновить пример ввода и вывода из обеих кодировок.

Пример:

Encoding enc = new UTF8Encoding();
string s = "abc";
Console.WriteLine("new UTF8Encoding(), preamble: {0}",
    BitConverter.ToString(enc.GetPreamble()));
Console.WriteLine("new UTF8Encoding(), payload: {0}",
    BitConverter.ToString(enc.GetBytes(s)));
enc = Encoding.UTF8;
Console.WriteLine("Encoding.UTF8, preamble: {0}",
    BitConverter.ToString(enc.GetPreamble()));
Console.WriteLine("Encoding.UTF8, payload: {0}",
    BitConverter.ToString(enc.GetBytes(s)));

который пишет:

new UTF8Encoding(), preamble:
new UTF8Encoding(), payload: 61-62-63
Encoding.UTF8, preamble: EF-BB-BF
Encoding.UTF8, payload: 61-62-63
...