Чтение файлов txt (в unicode и utf8) с помощью С#

Я создал два файла txt (windows notepad) с тем же содержимым "спасибо - спасибо" и сохранил их в utf8 и unicode. В блокноте они выглядят отлично. Затем я попытался их прочитать, используя .Net:

...File.ReadAllText(utf8FileFullName, Encoding.UTF8);

и

...File.ReadAllText(unicodeFileFullName, Encoding.Unicode);

Но в обоих случаях я получил это "спасибо -???????". Что не так?

Upd: код для utf8

static void Main(string[] args)
        {
            var encoding = Encoding.UTF8;
            var file = new FileInfo(@"D:\encodes\enc.txt");
            Console.OutputEncoding = encoding;
            var content = File.ReadAllText(file.FullName, encoding);
            Console.WriteLine("encoding: " + encoding);
            Console.WriteLine("content: " + content);
            Console.ReadLine();
        }

Результат: спасибо ÑÐÀÐ ° ÑиР± о

Ответ 1

Отредактировано как UTF8 должно поддерживать символы. Кажется, что вы выводите на консоль или место, у которого не было его набора кодировок. Если это так, вам нужно установить кодировку. Для консоли вы можете это сделать

string allText = File.ReadAllText(unicodeFileFullName, Encoding.UTF8);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(allText);

Ответ 2

При выводе кодированных многобайтовых символов Unicode или UTF-8 вам нужно будет установить кодировку, а также убедиться, что консоль имеет набор шрифтов, который поддерживает многобайтовый символ, чтобы отобразить соответствующий символ, С вашим существующим кодом появится MessageBox.Show(контент) или отображение в Windows или веб-форме.

Посмотрите http://msdn.microsoft.com/en-us/library/system.console.aspx для объяснения установки шрифтов в окне консоли.

"Поддержка символов Юникода требует, чтобы кодер распознавал конкретный символ Юникода, а также требует шрифт, который имеет глифы, необходимые для визуализации этого символа. Чтобы успешно отображать символы Юникода в консоли, шрифт консоли должен быть установлен на шрифт без растра или TrueType, такой как Consolas или Lucida Console."

В качестве дополнительной заметки вы можете использовать класс FileStream для чтения первых трех байтов файла и поискать индикатор метки байтового байта, чтобы автоматически устанавливать кодировку при чтении файла. Например, если byte [0] == 0xEF && байт [1] == 0xBB && byte [2] == 0xBF, тогда у вас есть кодированный файл UTF-8. Для получения дополнительной информации см. http://en.wikipedia.org/wiki/Byte_order_mark.

Ответ 3

Использовать тип кодировки По умолчанию

File.ReadAllText(unicodeFileFullName, Encoding.Default);

Он исправит ???? Chracters.