Преобразование текстового файла из ANSI в ASCII с помощью C#

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

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


EDIT: Что, если я использовал "BinaryReader" BinaryReader reader = new BinaryReader(input, Encoding.Default);, но этот ридер принимает (Stream, Encoding), но "Stream" является рефератом! И где я должен указать путь к файлу, из которого он будет читать?


person BDeveloper    schedule 09.04.2009    source источник
comment
Почему вы думаете, что хотите преобразовать его в ASCII? Ответ на этот вопрос может показать, во что вы на самом деле должны преобразовать его...   -  person Guffa    schedule 09.04.2009


Ответы (2)


Прямое преобразование из 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, то эти байты будут потеряны

ОБНОВЛЕНИЕ:

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

BinaryReader reader = new BinaryReader(File.Open("foo.txt", FileMode.Open),
                                       Encoding.GetEncoding(1252));
person Can Berk Güder    schedule 09.04.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.

person Marc Gravell    schedule 09.04.2009
comment
Хороший ответ, особенно за указание на то, что вы можете использовать статические методы File и вам не нужно напрямую задействовать FileStreams или буферы. - person Noldorin; 09.04.2009