Невозможно преобразовать специальные символы в файле UTF-8 в ANSI - PullRequest
1 голос
/ 13 апреля 2020

У меня есть файл, который нужно прочитать и в конце добавить текст. Программа не удалась из-за символа "í". При открытии файла в кодировке notepad ++ (UTF-8) я мог видеть enter image description here

В своем коде C# я пытался преобразовать его в кодировку по умолчанию, но приложение изменилось это к "?" вместо "í".

Пример кода:

string processFilePath = @"D:\Test\File1.txt";
string outfile = @"D:\Test\File2.txt";

using (StreamReader reader = new StreamReader(processFilePath))
{
    using (StreamWriter writer = new StreamWriter(outfile, false, Encoding.Default))
    {
        writer.WriteLine(reader.ReadToEnd());
    }
}

Я рассматривал похожие вопросы по SO (приведенный выше фрагмент кода был измененной версией отсюда): UTF-8 to Преобразование ANSI с использованием C#

Я пробовал разные типы кодирования, доступные в "System.Text.Encoding" - ASCII / UTF * / Default, но лучшее, что я мог получить, это "?" вместо "í".

Я также прошел: http://kunststube.net/encoding/, я многому научился, но все еще не смог решить проблему.

Что я получаю: enter image description here

Что мне нужно: enter image description here

На веб-сайте Microsoft : enter image description here

Что еще мне не хватает (Должно было быть легко, если существовал System.Text.Encoding.ANSI)

1 Ответ

2 голосов
/ 13 апреля 2020

MSDN :

StreamReader по умолчанию использует кодировку UTF-8, если не указано иное, вместо значения по умолчанию для кодовой страницы ANSI для текущей системы.

т. Е. При открытии StreamReader(processFilePath) он принимает данные, как в UTF-8, что, по-видимому, не так, т. Е. Если исходный текст соответствует стандарту ANSI или, скорее всего, Windows -1252 для испанского языка sh, используйте

using (StreamReader reader = new StreamReader(processFilePath, Encoding.GetEncoding(1252)))
{
    using (StreamWriter writer = new StreamWriter(outfile, false, Encoding.UTF8))
    {
        writer.WriteLine(reader.ReadToEnd());
    }
} 

Примечание указано 1252 и UTF8.

PS Также обратите внимание, что false в StreamWriter не добавится в конец, , но перезапишет .

...