#c_sharp #windows_phone_81
Необходимо из массива байт перевести текст в кодировке windows-1251 в строку. Для этого я использую встроенное средство: Encoding encoding = Encoding.GetEncoding("windows-1251"); Однако этот код выдаёт исключение: 'windows-1251' is not a supported encoding name. Parameter name: name Никак не могу понять, что здесь не так, в интернете и даже на англоязычном stackoverflow именно так вопрос с кодировкой и решают.
Ответы
Ответ 1
Судя по всему System.Text.Encoding поддерживает всего три кодировки: System.Text.Encoding.BigEndianUnicode System.Text.Encoding.Unicode System.Text.Encoding.UTF8 Соответственно он не может найти windows-1251. Ибо такой кодировки он не знает. Чтобы использовать windows-1251 кодировку вам нужно реализовать свой класс, наследующийся от System.Text.Encoding и описывающий данную кодировку. Примерно так: public class Windows1251 : Encoding { static string alpha = "\0\a\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"; public override int GetByteCount(char[] chars, int index, int count) { return count; } public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) { byte questionIndex = (byte)alpha.IndexOf('?'); for (int i = 0; i < charCount; i++) { int toIndex = byteIndex + i; int index = alpha.IndexOf(chars[charIndex + i]); if (index == -1) bytes[toIndex] = questionIndex; else bytes[toIndex] = (byte)index; } return charCount; } public override int GetCharCount(byte[] bytes, int index, int count) { return count; } public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) { for (int i = 0; i < byteCount; i++) { chars[i + charIndex] = alpha[bytes[byteIndex + i]]; } return byteCount; } public override int GetMaxByteCount(int charCount) { return charCount; } public override int GetMaxCharCount(int byteCount) { return byteCount; } }Ответ 2
С помощью сторонней библиотеки https://github.com/jstedfast/Portable.Text.Encoding легко получилось декодировать из кодировки windows-1251. Пример кода: var bytes = await response.Content.ReadAsByteArrayAsync(); Encoding encoding = Portable.Text.Encoding.GetEncoding(1251); var text = encoding.GetString(bytes, 0, bytes.Length);
Комментариев нет:
Отправить комментарий