Почему UTF-8 разрешена как кодовая страница "ANSI"?

Функция Windows _ setmbcp позволяет использовать любую действительную кодовую страницу...

(за исключением UTF-7 и UTF-8, которые не являются поддерживается)

ОК, не поддерживая UTF-7, имеет смысл: символы имеют неповторимые представления и представляют сложности и риски для безопасности.

Но почему не UTF-8?

Как я понимаю, версии функций API Windows "ANSI" преобразуют свои аргументы в UTF-16, вызывают эквивалентную "W" функцию и конвертируют любые строки в выходе в "ANSI". Это то, что я делал вручную. Итак, почему Windows не может сделать это для меня?

Ответ 1

Кодовая страница "ANSI" в основном устарела: эпоха Windows 9X. Все современные программы должны быть Unicode (то есть UTF-16) в любом случае.

В принципе, когда исходная составляющая кодовой страницы Ansi изначально была разработана, UTF-8 даже не был изобретен, и поэтому поддержка многобайтовых кодировок была довольно случайной (т.е. большинство кодовых страниц Ansi являются одиночными байтами, за исключением некоторых восточных Азиатские кодовые страницы, которые являются одним или двумя байтами). Добавление поддержки "правильных" многобайтовых кодировок, вероятно, считалось нецелесообразным, когда все новые разработки должны быть выполнены в UTF-16 в любом случае.

Ответ 2

_setmbcp() - это функция VС++ RTL, а не функция Win32 API. Это влияет только на то, как RTL интерпретирует строки. Он не влияет на функции Win32 API A. Когда они вызывают свои внутренние копии W внутри, функции A всегда используют MultiByteToWideChar() и WideCharToMultiByte(), определяя кодовую страницу 0 (CP_ACP), чтобы использовать кодовую страницу Ansi по умолчанию для конверсий.

Ответ 3

Майкл Каплан, эксперт по интернационализации от Microsoft, попытался ответить на этот в своем блоге.

В основном его объяснение состоит в том, что даже несмотря на то, что версии функций API Windows "ANSI" предназначены для обработки разных кодовых страниц, исторически существовало неявное ожидание того, что кодировка символов потребует не более двух байтов на кодовую точку. UTF-8 не соответствует этому ожиданию, и теперь для изменения всех этих функций потребуется огромное количество тестов.