Как читать byte[] с текущей кодировкой, используя потоковый ридер

Я хотел бы прочитать byte[] используя C# с текущей кодировкой файла.

Как написано в MSDN, кодировка по умолчанию будет UTF-8, когда конструктор не имеет кодировки:

var reader = new StreamReader(new MemoryStream(data)).

Я также попробовал это, но все еще получаю файл как UTF-8:

var reader = new StreamReader(new MemoryStream(data),true)

Мне нужно прочитать byte[] с текущей кодировкой.

2 ответа

Решение

Файл не имеет кодировки. Массив байтов не имеет кодировки. Байт не имеет кодировки. Кодирование - это то, что преобразует байты в текст и наоборот.

То, что вы видите в текстовых редакторах и тому подобном, на самом деле является магией программы: редактор пробует разные кодировки, а затем угадывает, какой из них наиболее целесообразен. Это также то, что вы включаете с помощью логического параметра. Если это не дает того, что вы хотите, то эта магия не работает.

var reader = new StreamReader(new MemoryStream(data), Encoding.Default);

будет использовать кодировку по умолчанию для OS/Location. Если это все-таки не то, что вам нужно, то вам нужно быть полностью явным и сообщить потоковому считывателю, какую именно кодировку использовать, например (просто в качестве примера вы сказали, что не хотите UTF8):

var reader = new StreamReader(new MemoryStream(data), Encoding.UTF8);

Я только что попытался использовать другой способ выяснить ByteEncoding, и это невозможно сделать, поскольку в байтовом массиве нет кодировки, как упоминает Ян в своем ответе. Однако вы всегда можете взять значение и выполнить преобразование типа в UTF8 или ASCII/Unicode и проверить строковые значения в случае, если вы выполняете "Text.EncodingFormat.GetString(byte [] array)"

public static bool IsUnicode(string input)    
{    
    var asciiBytesCount = Encoding.ASCII.GetByteCount(input);
    var unicodBytesCount = Encoding.UTF8.GetByteCount(input);
    return asciiBytesCount != unicodBytesCount;
}
Другие вопросы по тегам