Подтвердить что ты не робот

Что означает "Стандартная среда .NET использует стандарт кодирования UTF-16 по умолчанию" означает?

В моем учебном пособии (для экзамена 70-536) говорится об этом дважды в главе текста и кодирования, которая находится прямо после главы IO.

Все примеры до сих пор связаны с простым доступом к файлам с помощью FileStream и StreamWriter.

Он также говорит такие вещи, как "Если вы не знаете, какую кодировку использовать при создании файла, не указывайте его, а .NET будет использовать UTF16" и "Укажите различные кодировки с использованием перегрузок конструктора потока".

Не обращайте внимания на то, что фактические перегрузки находятся в классе StreamWriter, но эй, что угодно.

Я смотрю StreamWriter прямо сейчас в отражателе, и я уверен, что вижу, что по умолчанию действует actaully UTF8NoBOM.

Но ничего из этого не указано в errata. Это старая книга (cheked the errat обоих изданий), поэтому, если бы это было неправильно, я бы подумал, что кто-то взял ее на себя.....

Заставляет меня думать, может быть, я этого не понял.

Итак..... какие-то идеи, о чем он говорит? В другом месте, где есть дефолт?

Это просто полностью смутило меня.

4b9b3361

Ответ 1

"UTF-16" является раздражающим термином, поскольку он имеет два значения, которые легко путать.

Первое значение представляет собой серию 16-битных кодовых точек. Большинство из них соответствуют символу Юникода того же числа; символы за пределами базовой многоязычной плоскости (U + 10000 вверх) хранятся в виде двух 16-битных кодовых точек, каждый из Surrogates.

Многие языки используют UTF-16 в этом смысле для внутренних целей хранения, в том числе как собственный тип строки. Это обычный источник фраз типа ".NET(или Java) использует UTF-16 в качестве кодировки по умолчанию"..NET обращается к элементам такой строки 16 бит UTF-16 за раз (то есть на уровне реализации, как uint16).

Следующее, что нужно учитывать, это кодирование такой строки UTF-16 в линейные байты для хранения в файле или сетевом потоке. Как всегда, когда вы храните большие числа в байтах, существует два возможных кодировки: little-endian или big-endian. Таким образом, вы можете использовать "UTF-16LE" , кодировку little-endian UTF-16 в байтах или "UTF-16BE", кодировку большого конца.

( "UTF-16LE" чаще используется. Чтобы добавить больше путаницы к пламени, Windows дает ему глубоко вводящее в заблуждение и неоднозначное имя кодировки "Unicode". На самом деле почти всегда лучше использовать UTF-8 для хранения файлов и сетевых потоков, чем для UTF-16LE/BE.)

Но если вы не знаете, содержит ли пучок байтов "UTF-16LE" или "UTF-16BE", вы можете использовать трюк, чтобы посмотреть на первую кодовую точку, чтобы ее обработать. Эта кодовая точка, метка байтового заказа (BOM), действительна только при чтении в одну сторону, поэтому вы не можете ошибочно кодировать одну кодировку для другого.

Этот подход, не заботящийся о том, какой порядок байтов у вас есть, но с использованием спецификации для его указания, обычно называется под именем кодировки... "UTF-16" .

Итак, когда кто-то говорит "UTF-16" , вы не можете сказать, означают ли они последовательность коротких кодов Unicode кода или последовательность байтов в неуказанном порядке, который будет декодировать один.

( "UTF-32" имеет ту же проблему.)

Если вы не знаете, какую кодировку использовать при создании файла, не указывайте его, и .NET будет использовать UTF16

Если это прямая цитата, то это ложь. Построение StreamWriter без аргумента кодирования явно указано, чтобы дать вам UTF-8.

Ответ 3

Протестируйте его. Напишите строку "abcd" в файл. Если он использует UTF8, файл будет иметь размер 4 байта. В UTF16 это будет 8 байт. (плюс, возможно, спецификация)

Ответ 4

UTF16 - это кодировка по умолчанию, которую .NET будет использовать для кодирования строк в вашей программе (например, строковых переменных).

Ответ 5

У меня была эта проблема со статическим классом System.IO.File.

Я хотел написать строку, содержащую XML файл UTF-16 для файла.

Во-первых, я использовал

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));