Как я могу преобразовать расширенный ASCII в System.String? - PullRequest
19 голосов
/ 20 марта 2009

Например: «½» или ASCII DEC 189. Когда я читаю байты из текстового файла, байт [] содержит действительное значение, в данном случае 189.

Преобразование в Unicode приводит к замене символа Unicode 65533.

UnicodeEncoding.Unicode.GetString (б);

Преобразование в ASCII приводит к 63 или "?"

ASCIIEncoding.ASCII.GetString (б);

Если это невозможно, каков наилучший способ обработки этих данных? Я хотел бы иметь возможность выполнять строковые функции, такие как Replace ().

Ответы [ 4 ]

25 голосов
/ 20 марта 2009

Байт 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), но рекомендуется всегда указывать .

Вам потребуется некоторая форма неявных или (лучше) явных метаданных, чтобы предоставить вам информацию о том, какая кодировка.

12 голосов
/ 29 февраля 2012

Старый набор символов PC-8 или Extended ASCII существовал до того, как IBM и Microsoft представили идею кодовых страниц в мире ПК. Это был расширенный ASCII WAS - в 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);
    }
12 голосов
/ 20 марта 2009

Это зависит от того, какая именно кодировка.

Нет такой вещи, как "ASCII 189" - ASCII идет только до 127. Есть много кодировок, которые 8-битные кодировки используют ASCII для первых 128 значений.

Вы можете хотите Encoding.Default (которая является кодировкой по умолчанию для вашей конкретной системы), но это трудно точно знать. Откуда ваши данные?

1 голос
/ 18 июля 2014

System.String[] не может хранить символы с ASCII > 127 если вы пытаетесь работать с любыми расширенными символами ASCII, такими как œ ¢ ½ ¾, здесь - это метод для преобразования его в двоичный и десятичный эквивалент

...