Буквы C #, такие как å, неправильно отображаются в выходном файле - PullRequest
1 голос
/ 18 ноября 2011

Я работаю в C #, и это мой код:

        Encoding encoding;
        StringBuilder output = new StringBuilder();

        //somePath is string
        using (StreamReader sr = new StreamReader(somePath))
        {
            string line;
            encoding = sr.CurrentEncoding;
            while ((line = sr.ReadLine()) != null)
            {
                //make some changes to line
                output.AppendLine(line);
            }
        }

        using (StreamWriter writer = new StreamWriter(someOtherPath, false))//encoding
        {
            writer.Write(output);
        }

В файле, который находится на somePath, у меня есть норвежские символы, такие как å. Но, на файл в некотором другом пути я получаю знаки вопроса вместо них. Я думаю, что это проблема кодирования, поэтому я попытался получить кодировку входного файла и присвоить его выходному файлу. Результатов не было. Я попытался открыть файл с помощью Google Chrome и присвоить ему все возможные кодировки, но буквы были не такими, как во входном файле.

Ответы [ 2 ]

7 голосов
/ 18 ноября 2011

StreamReader может только догадываться относительно определенных кодировок.В идеале вы должны выяснить, какова на самом деле кодировка , а затем использовать ее для чтения файла.Для чего создан файл и что позволяет правильно его читать?Показывает ли последняя программа, какую кодировку она использует?(Например, он может использовать что-то вроде Windows-CP1252.)

Я бы лично рекомендовал бы использовать UTF-8 в качестве выходной кодировки, если вы можете, но это зависит от того,Вы можете контролировать все, что потом читает.

РЕДАКТИРОВАТЬ: Хорошо, теперь я видел файл, я могу подтвердить, что не UTF-8.Слово "direktør" представляется в виде этих байтов:

64 69 72 65 6b 74 f8 72

Таким образом, не-ASCII символ представляет собой один байт (F8), который является , а не действительным представлением UTF-8символ.

Это может быть ISO-Latin-1 - не ясно (есть несколько кодировок, которые будут соответствовать).Если это так, вы можете использовать:

Encoding encoding = Encoding.GetEncoding(28591);

using (TextReader reader = new StreamReader(filename, encoding))
{
    ...
}

(В качестве альтернативы используйте File.ReadAllLines, чтобы упростить жизнь.)

Вам нужно будет работать отдельнокакую выведите нужную вам кодировку.

РЕДАКТИРОВАТЬ: Вот короткая, но полная программа, которую я запустил для файла, который вы указали, и который правильно преобразовал символ в UTF-8:

using System;
using System.IO;
using System.Text;

class Test
{
    static void Main()
    {
        Encoding encoding = Encoding.GetEncoding(28591);
        StringBuilder output = new StringBuilder();
        using (TextReader reader = new StreamReader("file.html", encoding))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                output.AppendLine("Read line: " + line);
            }
        }
        using (StreamWriter writer = new StreamWriter("output.html", false))
        {
            writer.Write(output);
        }
    }
}
1 голос
/ 18 ноября 2011

Попробуйте этот случай, чтобы сохранить ваш текст:

using (StreamWriter writer = new StreamWriter(someOtherPath, Encoding.UTF8)) { ... }    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...