Какова кодировка строки, полученной из StreamReader.ReadLine()

#c# #unicode #streamreader

#c# #Юникод #streamreader

Вопрос:

Сначала давайте посмотрим код:

 //The encoding of utf8.txt is UTF-8
StreamReader reader = new StreamReader(@"C:\utf8.txt", Encoding.UTF8, true);
while (reader.Peek() > 0)
{
    //What is the encoding of lineFromTxtFile?
    string lineFromTxtFile = reader.ReadLine();
}
  

Как сказал Джоэл в своей знаменитой статье:

Если у вас есть строка в памяти, в файле или в сообщении электронной почты, вы должны знать, в какой кодировке она находится, иначе вы не сможете правильно интерпретировать ее или отобразить пользователям.»

Итак, возникает мой вопрос: какова кодировка строки lineFromTxtFile? UTF-8 (потому что это текстовый файл, закодированный в UTF-8)? или UTF-16 (поскольку строка в .NET является «Unicode» (UTF-16))?

Спасибо.

Ответ №1:

Все.Чистые строковые переменные кодируются с помощью Encoding.Юникод (UTF-16, строчный порядковый номер). Еще лучше, поскольку вы знаете, что ваш текстовый файл имеет формат utf-8, и указали вашему streamreader правильную кодировку в конструкторе, любые специальные символы будут обработаны правильно.

Ответ №2:

.NET-строки являются Unicode. Кодирование не играет роли, затем, пока вам не понадобится использовать его в следующий раз. Например, если вы собираетесь записать ее в файл, тогда вы укажете кодировку вывода. Но поскольку.NET обрабатывает все, что вы делаете со строкой, с помощью вызовов библиотеки, не имеет значения, как это представлено в памяти.

Комментарии:

1. Итак, если я хочу сбросить эту строку в файл, StreamWriter writer = new StreamWriter(@"C:unicide.txt",false, Encoding.Unicode);writer.WriteLine(lineFromTxtFile ) ?

2. @jjooeell Кодировка, которую вы предоставляете для записи потока, не имеет отношения к тому, как эта строка была сохранена в памяти. Он используется для преобразования символов в байты, а не байтов в байты.

3. Согласен. Указанная вами там кодировка сообщает, как она в конечном итоге записывается на диск, а не то, что уже находится в памяти.

4. Этот ответ не очень точный, все строки в юникоде закодированы. Utf16 для строк .NET, с наименьшим порядком окончания на большинстве компьютеров.

Ответ №3:

Это был бы Unicode, потому что все .ЧИСТЫЕ строки являются. Реальный вопрос: почему это имеет значение?

Комментарии:

1. Для доказательства эти коды не нужны: byte[] dataByte = .Encoding.UTF8GetBytes(lineFromTxtFile);string strOutLine = Encoding.Unicode.GetString(dataByte);

2. @jjooeell Я не уверен, о чем ты говоришь.

3. поскольку lineFromTxtFile это уже строка «Unicode» (UTF-16), преобразование (UTF-8-> byte[]-> UTF-16) не требуется.