Проблема с кодировкой текстового файла - PullRequest
2 голосов
/ 18 октября 2011

Я нашел несколько вопросов о проблемах кодирования, прежде чем задавать их, однако они не являются тем, что я хочу. В настоящее время у меня есть два метода, я бы лучше не изменял их.

//FileManager.cs
public byte[] LoadFile(string id);
public FileStream LoadFileStream(string id);

Они работают правильно для всех типов файлов. Теперь у меня есть идентификатор текстового файла (он гарантированно будет .txt файл), и я хочу получить его содержимое. Я попробовал следующее:

byte[] data = manager.LoadFile(id);
string content = Encoding.UTF8.GetString(data);

Но, очевидно, он не работает для других кодировок, не относящихся к UTF8. Чтобы решить проблему с кодировкой, я сначала попытался получить FileStream, а затем использовать StreamReader.

public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks);

Я надеюсь, что этот повелитель может разрешить кодировку, но я все еще получаю странное содержимое.

using(var stream = manager.LoadFileStream(id))
using(var reader = new StreamReader(stream, true))
{
    content = reader.ReadToEnd();    //still incorrect
}

Может быть, я неправильно понял использование detectEncodingFromByteOrderMarks? И как решить проблему с кодировкой?

1 Ответ

1 голос
/ 18 октября 2011

ByteOrderMarks иногда добавляется к файлам, закодированным в одном из форматов Unicode, чтобы указать, хранятся ли символы, составленные из нескольких байтов, в формате с прямым или старшим порядком байтов (сначала байт 1, а затем байт0? Или сначала байт 0, а затем байт 1?).Это особенно актуально, когда файлы читаются как, например, Windows и Unix-машинами, потому что они пишут эти многобайтовые символы в противоположных направлениях.

Если вы читаете файл, а первые несколько байтов равны байту ByteOrderMark, скорее всего,достаточно высоки, файл закодирован в формате Unicode, который соответствует этому ByteOrderMark.Вы никогда не знаете наверняка, как упоминал Shadow Wizard.Поскольку это всегда предположение, опция предоставляется в качестве параметра.

Если в первых байтах файла нет ByteOrderMark, будет трудно угадать кодировку файла.

Дополнительная информация: http://en.wikipedia.org/wiki/Byte_order_mark

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