«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.