Что означает ".NET Framework по умолчанию использует стандарт кодирования UTF-16"?
В моем учебном пособии (для экзаменов 70-536) об этом говорится дважды в главе, посвященной текстам и кодированию, которая находится сразу после главы IO.
Пока что все примеры касаются простого доступа к файлам с использованием FileStream и StreamWriter.
В нем также говорится что-то вроде: "Если вы не знаете, какую кодировку использовать при создании файла, не указывайте ее, а.NET будет использовать UTF16" и "Укажите разные кодировки с использованием перегрузок конструктора Stream".
Не берите в голову факт, что фактические перегрузки находятся на классе StreamWriter, но эй, что угодно.
Я смотрю на StreamWriter прямо сейчас в отражателе, и я уверен, что я вижу, что по умолчанию на самом деле UTF8NoBOM.
Но ничего из этого не указано в списке ошибок. Это старая книга (проверенная ошибка обоих изданий), так что если бы она была не права, я бы подумала, что кто-то ее нашел...
Заставляет меня думать, что, может быть, я этого не понял.
Итак... есть идеи, о чем идет речь? Какое-то другое место, где есть дефолт?
Это просто смутило меня.
5 ответов
"UTF-16" - раздражающий термин, так как он имеет два значения, которые легко спутать.
Первое значение - это серия 16-битных кодов. Большинство из них соответствуют непосредственно символу Unicode того же номера; символы вне базовой многоязычной плоскости (U+10000 и выше) хранятся в виде двух 16-битных кодовых точек, каждая из которых является суррогатом.
В этом смысле многие языки используют UTF-16 для внутреннего хранения, в том числе в качестве собственного типа строки. Это обычный источник фраз типа ".NET (или Java) использует UTF-16 в качестве кодировки по умолчанию". .NET обращается к элементам такой строки UTF-16 по 16 битов за раз (т. Е. На уровне реализации, как uint16).
Следующее, что следует рассмотреть, - это кодирование такой строки UTF-16 в линейные байты для хранения в файле или сетевом потоке. Как всегда, когда вы храните большие числа в байтах, возможны две кодировки: little-endian или big-endian. Таким образом, вы можете использовать "UTF-16LE", кодировку с прямым порядком байтов UTF-16 в байтах, или "UTF-16BE", кодировку с прямым порядком байтов.
("UTF-16LE" используется чаще всего. Просто чтобы еще больше запутать пламя, Windows дает ему глубоко вводящее в заблуждение и неоднозначное кодовое имя "Unicode". В действительности почти всегда лучше использовать UTF-8 для хранения файлов). и сетевые потоки, чем любой из UTF-16LE/BE.)
Но если вы не знаете, содержит ли группа байтов "UTF-16LE" или "UTF-16BE", вы можете использовать хитрость просмотра первой кодовой точки, чтобы решить это. Этот код, метка порядка байтов (BOM), действителен только при чтении в одну сторону, поэтому вы не можете принять одну кодировку за другую.
Этот подход, состоящий не в том, какой порядок следования байтов вы используете, а в том, что для его передачи используется спецификация, обычно упоминается под названием кодировки... "UTF-16".
Таким образом, когда кто-то говорит "UTF-16", вы не можете сказать, означают ли они последовательность коротких int кодовых точек Unicode или последовательность байтов в неуказанном порядке, которая будет декодироваться в одну.
("UTF-32" имеет ту же проблему.)
Если вы не знаете, какую кодировку использовать при создании файла, не указывайте ее, и.NET будет использовать UTF16
Если это фактическая прямая цитата, то это ложь. Построение StreamWriter без аргумента кодировки явно указывается, чтобы дать вам UTF-8.
Попробуй это. Запишите строку "abcd" в файл. Если он использует UTF8, файл будет иметь размер 4 байта. Под UTF16 это будет 8 байтов. (плюс, возможно, спецификация)
UTF16 - это кодировка по умолчанию, которую.NET будет использовать для кодирования строк в вашей программе (например, строковых переменных).
У меня была эта проблема со статическим System.IO.File
учебный класс.
Я хотел написать строку, содержащую UTF-16 XML в файл.
Во-первых, я использовал
using(StreamWriter writer = File.CreateText(xmlFilePathTarget))
{
writer.Write(xmlString);
}
Но поскольку он записал строку как UTF-8, IE не открывал ее и отображал ошибку:
Страница XML не может быть отображена. Невозможно просмотреть ввод XML с использованием таблицы стилей. Пожалуйста, исправьте ошибку и затем нажмите кнопку Обновить, или повторите попытку позже.
Переключение с текущей кодировки на указанную кодировку не поддерживается. Ошибка обработки ресурса 'file:///C:/Documents and Setti...
Во многом благодаря этой статье я обнаружил, что решение заключается в явном использовании StreamWriter
конструктор:
StreamWriter writer = new StreamWriter(xmlFilePathTarget, false, Encoding.Unicode));