Что означает «.NET Framework по умолчанию использует стандарт кодирования UTF-16»? - PullRequest
17 голосов
/ 24 марта 2009

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

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

В нем также говорится что-то вроде: «Если вы не знаете, какую кодировку использовать при создании файла, не указывайте ее, а .NET будет использовать UTF16» и «Укажите разные кодировки с использованием перегрузок конструктора Stream».

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

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

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

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

Так ... есть идеи, о чем идет речь? Какое-то другое место, где есть дефолт?

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

Ответы [ 5 ]

37 голосов
/ 24 марта 2009

«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», вы не можете сказать, означают ли они последовательность кодовых точек Unicode с коротким int или последовательность байтов в неуказанном порядке, которая будет декодироваться в единицу.

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

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

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

3 голосов
/ 24 марта 2009

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

2 голосов
/ 18 февраля 2010

У меня была эта проблема со статическим 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));
2 голосов
/ 24 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...