#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) не требуется.