Функция Windows _setmbcp позволяет любую действительную кодовую страницу...
(кроме UTF-7 и UTF-8, которые не поддерживаются),
Хорошо, не поддержка UTF-7 имеет смысл: Символы имеют групповые представления, и это представляет сложность и угрозы безопасности.
Но почему не UTF-8?
Насколько я понимаю версии "ANSI" Windows API functions преобразовывают свои аргументы UTF-16, вызывают эквивалентную функцию "W" и преобразовывают любые строки в выводе к "ANSI". Это - то, что я делал вручную. Итак, почему Windows не может сделать этого для меня?
Кодовая страница "ANSI" по сути является наследием: эпоха Windows 9X. Все современное программное обеспечение должно быть основано на Unicode (то есть UTF-16).
По существу, когда кодовая страница Ansi была первоначально разработана, UTF-8 еще не был изобретен, и поэтому поддержка многобайтовых кодировок была довольно бессистемной (т.е. большинство кодовых страниц Ansi являются однобайтовыми, за исключением некоторых восточноазиатских кодовых страниц, которые являются одно- или двухбайтовыми). Добавление поддержки "правильных" многобайтовых кодировок, вероятно, было сочтено не стоящим усилий, поскольку все новые разработки в любом случае должны вестись в UTF-16.
_setmbcp ()
- это функция VC ++ RTL, а не функция Win32 API. Это влияет только на то, как RTL интерпретирует строки. Это никак не влияет на функции Win32 API A
. Когда они вызывают свои аналоги W
внутри, функции A
всегда используют MultiByteToWideChar ()
и WideCharToMultiByte ()
с указанием кодовой страницы 0 ( ] CP_ACP
), чтобы использовать системную кодовую страницу Ansi по умолчанию для преобразований.