Что такое кодировка для чтения и записи файлов со специальными символами, такими как тире, левые кавычки и т. Д.? - PullRequest
0 голосов
/ 25 мая 2018

Я читаю CSV-файлы, которые содержат специальные символы, такие как длинная и тире - слева, двойные кавычки «и двойные правые кавычки», и я не могу понять, как правильно их читать и писать.Я думал, что это был UTF8 или Unicode, но он читает и записывает их в виде квадрата или?с бриллиантом.Открытие файлов в блокноте ++ для подтверждения.Может быть, нужна другая конкретная кодировка?Вот код, который я использовал до сих пор, попробовал несколько вариантов этого с другой кодировкой.:

string[] lines = File.ReadAllLines(filePathTxt.Text, Encoding.UTF8);
...
Stream s = new FileStream(filePath, FileMode.Append);
StreamWriter sw = new StreamWriter(s, Encoding.UTF8, 1000, true);

Ввод:

Опросы - общедоступные

Документы: «A»

отображается как

Опросы � Публичные

Документы:, �A�

Также отображаются проблемы в отладчике, как толькоон читается в массив строк.

Редактировать: я также пробовал Unicode.Я использую NotePad ++, Win 10. Проблема определенно на этапе чтения, потому что, если я добавлю следующую строку, чтобы вручную написать строку данных, например так:

 sw.WriteLine("Surveys – Public");

Эта строка записывает тирехорошо, так что это при первоначальном чтении файла из исходного CSV, где символы перепутаны.Я пытался читать с несколькими различными кодировками, и NotePad ++ просто показывает, что CSV является ANSI.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Вместо:

StreamWriter sw = new StreamWriter(s, Encoding.UTF8, 1000, true);

используйте это:

StreamWriter sw = new StreamWriter(s, Encoding.Unicode, 1000, true);

Я только что попробовал, и он правильно отображается в NotePad ++

Вот пример, который я запустил, чтоЯ использовал для тестирования:

        using (StreamWriter swClifor = new StreamWriter("test.txt", true, Encoding.Unicode))
        {
            string cString = "en dash –, left double quotes “, and right double quotes ”";
            swClifor.WriteLine(cString);
        }
0 голосов
/ 25 мая 2018

О, чувак, я понял это сейчас, это кажется глупым, но вот что это было.

Строка состояния NotePad ++ показала его как ANSI.Первоначально я пытался без предоставления кодировки при чтении или записи.

При просмотре параметров используемой кодировки я обнаружил, что в Encoding for Default была опция:

string[] lines = File.ReadAllLines(filePathTxt.Text, Encoding.Default);

НО Iна самом деле никогда не пробовал этот, потому что наверняка не указание, какую кодировку использовать, должно быть уже по умолчанию, верно?Ну, я думаю, что нет, потому что на самом деле, давая это на чтение и запись, теперь это работает правильно.

0 голосов
/ 25 мая 2018

Ваш код работает нормально , если файл, который вы читаете, уже закодирован в UTF-8, но он не будет работать, если он использует другую кодировку.Я бы порекомендовал загрузить файл в текстовый редактор, такой как Notepad ++, который сообщает вам, какова кодировка файла (в строке состояния).Если он не закодирован в UTF-8 для начала, чтение и запись как UTF-8 не будут работать.

Если вы хотите попробовать прочитать файл в кодировке системы по умолчанию, вы можете использовать Encoding.Defaultвместо UTF8.Затем вы должны записать в новый файл при записи файла, потому что вы не можете написать несколько кодировок в один и тот же файл.Кодировка по умолчанию, вероятно, будет правильной кодировкой, если UTF-8 - нет.

string filePath = @"C:\users\yourname\desktop\TestFile.txt";
string[] lines = File.ReadAllLines(filePath, Encoding.Default);

string outFile = @"C:\users\yourname\desktop\outfile.txt";
Stream s = new FileStream(outFile, FileMode.Append);
StreamWriter sw = new StreamWriter(s, Encoding.UTF8, 1000, true);
foreach (var line in lines)
   sw.WriteLine(line);
sw.Close();

В качестве альтернативы, если вам нужно добавить в тот же файл, используйте ту же кодировку, которую вы использовали для чтения файла,или перепишите весь файл.Если исходный файл выглядит нормально в блокноте, кодировка системы по умолчанию, вероятно, будет правильной кодировкой.Если вы хотите оставить файл в текущей кодировке системы, используйте Encoding.Default.Если вы хотите изменить кодировку всего файла на UTF-8, я думаю, вам придется переписать весь файл вместо добавления.

Если Notepad ++ показывает это в строке состояния, то вы можете 't читать файл как UTF-8 enter image description here

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

enter image description here

Вы можете использовать команду «Преобразовать в UTF-8» меню «Кодировка» в Notepad ++, чтобы сделать файл совместимым с вашим приложением.

Предупреждение : Не путайте команду «Кодировать в UTF-8» с командой «Преобразовать в UTF-8».Если файл выглядит правильно, вы хотите использовать «Преобразовать в UTF-8».Если вы используете «Кодирование в UTF-8», которое будет интерпретировать существующие данные как новую кодировку вместо изменения содержимого для использования новой кодировки.

Редактировать : Изменить Encoding.GetEncoding(0) до Encoding.Default.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...