У меня есть массив байтов, который я получил из FileStream.Read, и я хотел бы превратить это в строку. Я не на 100% уверен в кодировке - это просто файл, который я сохранил на диск - как мне сделать преобразование? Есть ли класс .NET, который читает метку порядка байтов и может определить кодировку для меня?Как преобразовать массив байтов в строку
ответ
Если File.ReadAllText
будет читать файл правильно, у вас есть несколько вариантов.
Вместо вызова BeginRead
, вы можете просто позвонить File.ReadAllText
асинхронно:
delegate string AsyncMethodCaller(string fname);
static void Main(string[] args)
{
string InputFilename = "testo.txt";
AsyncMethodCaller caller = File.ReadAllText;
IAsyncResult rslt = caller.BeginInvoke(InputFilename, null, null);
// do other work ...
string fileContents = caller.EndInvoke(rslt);
}
Или вы можете создать MemoryStream
из массива байтов, а затем использовать StreamReader
по этому вопросу.
System.IO.File.ReadAllText делает то, что вы хотите.
См. how-to-guess-the-encoding-of-a-file-with-no-bom-in-net.
Поскольку строки Юникод, вы должны указать кодировку при преобразовании. Текстовые потоки (даже ReadAllText()
) имеют активную кодировку внутри, обычно это разумное значение по умолчанию.
попробовать что-то вроде этого:
buffer = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buffer);
newString = Encoding.UTF8.GetString(buffer, 0, len);
Почему это лучше, чем просто использовать Encoding.GetEncoding («iso-8859-1»). GetString (...) в первую очередь? Дело в том, что ОП не знает, что такое кодировка. –
Как много вы знаете о файле? Может ли это быть любой кодировкой? Если это так, вам нужно будет использовать эвристику, чтобы угадать кодировку. Если это будет UTF-8, UTF-16 или UTF-32, то
new StreamReader(new MemoryStream(bytes), true)
определит кодировку автоматически. Текст довольно неприятный, если вы действительно не знаете кодировку. Есть много случаев, когда вы действительно просто гадали.
Там нет простого способа получить кодировку, но, как упоминалось выше, использование
string str = System.Text.Encoding.Default.GetString(mybytearray);
если вы не имеете ни малейшего представление о том, что кодирование. Если вы находитесь в Европе, то ISO-8859-1, вероятно, является кодировкой.
string str = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(mybytearray);
Я бы, если бы я мог, но, к сожалению, мне нужно сделать это ASync используя метод BeginRead который только возвращает массив байтов ... – 2009-03-31 05:06:34
Fair достаточно тогда. В этом случае ответ jon skeet ниже (или выше, теперь, вероятно) хорош. – Chris
Также ReadAllText предполагает UTF-8. –