Member 13827278 Ответов: 2

Проблема кодирования текста в C# - encoding.getchars() дает странные результаты


Я работаю над проектом, который включает японский текст, закодированный в Shift-JIS. Я пытаюсь декодировать полезные символы из массивов байтов вот так:
Encoding encoding = Encoding.GetEncoding(932);
string test = new string(encoding.GetChars(byteArray));

Это работает для 99% данных, но я получаю странные результаты только для нескольких символов. Характер ", например. Если я получу байты, соответствующие этому символу, например:
byte[] getBytesTest = encoding.GetBytes("¨");

Результаты именно такие, каких я и ожидал. Два байта, 0x81 и 0x4E, то есть то, что этот символ должен быть в Shift-JIS.
Однако если я попытаюсь преобразовать его обратно в строку:
string getCharsTest = new string(encoding.GetChars(getBytesTest));

...Я получаю вывод ошибки по умолчанию "?".

Так что tl;dr, я пытаюсь понять, почему это так:
byte[] getBytesTest = encoding.GetBytes("¨");
string getCharsTest = new string(encoding.GetChars(getBytesTest));

в результате получается "?" вместо"".

Что я уже пробовал:

Передача результатов GetBytes() в GetChars() и ручная передача байтов следующим образом:
encoding.GetChars(new byte[] {0x81, 0x4E})

и то, и другое не дает ожидаемого результата.

Не знаю, куда с этим идти.

2 Ответов

Рейтинг:
2

AshishVishwakarma

Проблема здесь заключается в кодировке, которую консоль не понимает. Если вы запишете содержимое в файл, а не в консоль, то получите текст, как и ожидалось.

File.WriteAllText("file.txt", getCharsTest);


Рейтинг:
0

RickZeeland

Ваш код в порядке, когда я пытаюсь сделать это на Win 10 в VS2017, он работает:

System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(932);
byte[] getBytesTest = encoding.GetBytes("¨");
string getCharsTest = new string(encoding.GetChars(getBytesTest));
Может быть, вам нужно обновить свою Windows ?