Как преобразовать расширенный ascii в System.String?
-
21-08-2019 - |
Вопрос
Например:«½» или ASCII DEC 189.Когда я читаю байты из текстового файла, byte[] содержит допустимое значение, в данном случае 189.
Преобразование в Юникод приводит к замене символа Юникода 65533.
UnicodeEncoding.Unicode.GetString(b);
Преобразование в ASCII приводит к результату 63 или "?"
ASCIIEncoding.ASCII.GetString(b);
Если это невозможно, как лучше всего обработать эти данные?Я хотел бы иметь возможность выполнять строковые функции, такие как replace().
Решение
Байт 189 представляет собой «½» в iso-8859-1 (также известном как «Latin-1»), поэтому, возможно, вам нужно следующее:
var e = Encoding.GetEncoding("iso-8859-1");
var s = e.GetString(new byte[] { 189 });
Все строки и символы в .NET имеют кодировку UTF-16, поэтому вам нужно использовать кодировщик/декодер для преобразования чего-либо еще, иногда это используется по умолчанию (например,UTF-8 для экземпляров FileStream), но рекомендуется всегда указывать.
Вам понадобится некоторая форма неявных или (лучше) явных метаданных, чтобы предоставить вам информацию о том, какая кодировка.
Другие советы
Это зависит от того, какая именно кодировка.
Не существует такого понятия, как «ASCII 189» — ASCII может достигать только 127.Существует множество кодировок, в которых для первых 128 значений используются 8-битные кодировки ASCII.
Ты может хотеть Encoding.Default
(это кодировка по умолчанию для вашей конкретной системы), но это трудно знать наверняка.Откуда ваши данные?
Старый набор символов PC-8 или расширенный набор символов ASCII существовал еще до того, как IBM и Microsoft представили миру ПК идею кодовых страниц.Это БЫЛ расширенный ASCII — в 1982 году.Фактически, это был ЕДИНСТВЕННЫЙ набор символов, доступный на ПК в то время, пока карта EGA не позволяла загружать другие шрифты во VRAM.
Это также был стандарт по умолчанию для терминалов ANSI, и почти каждая BBS, к которой я подключался в 80-х и начале 90-х годов, использовала этот набор символов для отображения меню и окон.
Вот код для преобразования 8-битного расширенного ASCII в текст Unicode.Обратите внимание на ключевой фрагмент кода:GetEncoding("437").При этом использовалась кодовая страница 437 для перевода 8-битного текста ASCII в эквивалент Unicode.
string ASCII8ToString(byte[] ASCIIData)
{
var e = Encoding.GetEncoding("437");
return e.GetString(ASCIIData);
}
System.String[]
не может хранить символы с ASCII > 127
если вы пытаетесь работать с любыми расширенными символами ASCII, такими как œ ¢ ½ ⅘
здесь это метод преобразования его в двоичный и десятичный эквивалент