Преобразование текстового файла из ANSI в ASCII с использованием C # - PullRequest
19 голосов
/ 09 апреля 2009

У меня есть файл в кодировке ANSI, и я хочу преобразовать строки, прочитанные мной из файла, в ASCII.

Как мне сделать это в C #?


РЕДАКТИРОВАТЬ: Что делать, если я использовал "BinaryReader" BinaryReader reader = new BinaryReader(input, Encoding.Default); но этот читатель берет (Stream, Encoding) но «Стрим» это абстракция! И куда мне положить путь к файлу, из которого он будет читать?

Ответы [ 2 ]

30 голосов
/ 09 апреля 2009

Прямое преобразование из ANSI в ASCII не всегда возможно, поскольку ANSI является расширенным набором ASCII.

Вы можете попробовать конвертировать в UTF-8, используя Encoding, но:

Encoding ANSI = Encoding.GetEncoding(1252);

byte[] ansiBytes = ANSI.GetBytes(str);
byte[] utf8Bytes = Encoding.Convert(ANSI, Encoding.UTF8, ansiBytes);

String utf8String = Encoding.UTF8.GetString(utf8Bytes);

Конечно, вы можете заменить UTF8 на ASCII, но это не имеет смысла, так как:

  • если исходная строка не содержит байтов> 126, то это уже ASCII
  • если исходная строка содержит один или несколько байтов> 126, то эти байты будут потеряны

UPDATE:

В ответ на обновленный вопрос вы можете использовать BinaryReader следующим образом:

BinaryReader reader = new BinaryReader(File.Open("foo.txt", FileMode.Open),
                                       Encoding.GetEncoding(1252));
23 голосов
/ 09 апреля 2009

Как правило, вам нужно указать Encoding при чтении / записи файла. Например:

// read with the **local** system default ANSI page
string text = File.ReadAllText(path, Encoding.Default); 

// ** I'm not sure you need to do this next bit - it sounds like
//  you just want to read it? **

// write as ASCII (if you want to do this)
File.WriteAllText(path2, text, Encoding.ASCII);

Обратите внимание, что после прочтения text фактически является юникодом в памяти.

Вы можете выбрать разные кодовые страницы, используя Encoding.GetEncoding.

...