Реализация wchar_t
в Windows stdlib не имеет отношения к UTF-16: она знает только о 16-битных единицах кода.
Таким образом, вы можете поместить суррогатную последовательность UTF-16 в строку, и вы можете обрабатывать ее как один символ, используя обработку более высокого уровня. Строковая реализация не сделает ничего, чтобы помочь вам или помешать вам; это позволит вам включить в последовательность любую последовательность единиц кода, даже те, которые будут недопустимыми при интерпретации как UTF-16.
Многие из высокоуровневых функций Windows поддерживают символы, сделанные из суррогатов UTF-16, поэтому вы можете вызвать файл ?.txt
и увидеть, что он правильно отображает и редактирует (с помощью одного нажатия клавиши, но не во-вторых, для перемещения за символ) в таких программах, как Explorer, которые поддерживают сложную разметку текста (обычно с помощью библиотеки Uniscribe Windows).
Но все еще есть места, где вы можете видеть, как пропускает забвение UTF-16, например, тот факт, что вы можете создать файл с именем ?.txt
в той же папке, что и ?.txt
, где нечувствительность к регистру в противном случае запрещала бы это или тот факт, что вы можете создать [U+DC01][U+D801].txt
программно.
Вот как у педантов может быть хороший длинный и в основном бессмысленный аргумент о том, «поддерживает ли Windows» строки UTF-16 или только UCS-2.