Как преобразовать расширенный ascii в System.String?

StackOverflow https://stackoverflow.com/questions/666385

  •  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, такими как œ ¢ ½ ⅘здесь это метод преобразования его в двоичный и десятичный эквивалент

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top