Как читать 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;
}