Юникод в Microsoft Windows
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2011 г. ) |
Microsoft была одной из первых компаний, внедривших Unicode в свои продукты. Windows NT была первой операционной системой, которая использовала «широкие символы» в системных вызовах . используя (ныне устаревшую) схему кодирования UCS-2 Сначала переменной ширины, , она была обновлена до кодировки UTF-16 начиная с Windows 2000 , что позволяет представлять дополнительные плоскости с суррогатными парами. Однако Microsoft не поддерживала UTF-8 в своем API до мая 2019 года.
До 2019 года Microsoft делала упор на UTF-16 (т. е. -W API), но с тех пор рекомендовала использовать UTF-8 (по крайней мере, в некоторых случаях). [1] в Windows и Xbox (и в других своих продуктах) даже заявляет: «UTF-8 — это универсальная кодовая страница для интернационализации [и] UTF-16 [... — это] уникальное бремя, которое Windows возлагает на код, предназначенный для нескольких платформ». . [..] Windows [переходит] к поддержке UTF-8, чтобы устранить это уникальное бремя, [что приводит] к меньшему количеству проблем с интернационализацией в приложениях и играх». [2]
В большом количестве документации Microsoft слово «Юникод» используется для явной ссылки на кодировку UTF-16. Все остальное, включая UTF-8, не является «Юникодом» на устаревшем языке Microsoft (в то время как UTF-8 и UTF-16 являются Unicode в соответствии со стандартом Unicode или его кодировками/«форматами преобразования»).
В различных семействах Windows
[ редактировать ]Системы на базе Windows NT
[ редактировать ]Текущие версии Windows и все версии Windows XP и более ранних версий Windows NT (3.x, 4.0) поставляются с системными библиотеками , которые поддерживают кодировку строк двух типов: 16-битный «Unicode» ( UTF-16, начиная с Windows 2000 ) и ( иногда многобайтовая) кодировка, называемая « кодовой страницей » (или неправильно называемая ANSI кодовой страницей ). 16-битные функции имеют имена с суффиксом «W» (от «широкий» ), например: SetWindowTextW
. Функции, ориентированные на кодовую страницу, используют суффикс «A» для «ANSI», например: SetWindowTextA
(некоторые другие соглашения использовались для API, скопированных из других систем, например _wfopen/fopen
или wcslen/strlen
). Это разделение было необходимо, поскольку многие языки, включая C , не предоставляли четкого способа передачи 8-битных и 16-битных строк в одну и ту же функцию.
Microsoft попыталась обеспечить «переносимую» поддержку Unicode, предоставив компилятору переключатель «UNICODE», который переключает «общие» вызовы без суффиксов с интерфейса «A» на интерфейс «W» и преобразует все строковые константы в «широкие» версии UTF-16. . [3] [4] На самом деле это не работает, поскольку не преобразует UTF-8 за пределы строковых констант, в результате чего код, пытающийся открыть файлы, просто не компилируется. [ нужна ссылка ]
Ранее, независимо от переключателя «UNICODE», Windows также предоставляла переключатель API многобайтовых наборов символов (MBCS). [5] Это изменяет некоторые функции, которые не работают в MBCS, например strrev
на устройство, поддерживающее MBCS, например _mbsrev
. [6] [7]
Windows CE
[ редактировать ](сейчас снятой с производства) В Windows CE UTF-16 использовался почти исключительно, при этом API «A» в основном отсутствовал. [8] В Windows CE 5.0 доступен ограниченный набор API-интерфейсов ANSI для использования в сокращенном наборе локалей, которые можно выборочно встраивать в образ среды выполнения. [9]
Windows 9x
[ редактировать ]В 2001 году Microsoft выпустила специальное дополнение к старым системам Microsoft Windows 9x . Он включает в себя динамическую библиотеку unicows.dll (всего 240 КБ), содержащую 16-битную версию (те, что с буквой W на конце) всех основных функций Windows API. Это всего лишь слой перевода: SetWindowTextW
просто преобразует свои входные данные, используя текущую кодовую страницу, и вызовет SetWindowTextA
.
UTF-8
[ редактировать ]Microsoft Windows ( Windows XP и более поздние версии) имеет кодовую страницу, предназначенную для UTF-8 , кодовую страницу 65001. [10] или CP_UTF8
. В течение долгого времени было невозможно установить кодовую страницу локали на 65001, оставляя эту кодовую страницу доступной только для а) функций явного преобразования, таких как MultiByteToWideChar и/или б) Win32. консольной команды chcp 65001
для перевода stdin/out между UTF-8 и UTF-16. Это означало, что «узкие» функции, в частности fopen
(который открывает файлы), нельзя было вызвать со строками UTF-8, и фактически не было возможности открыть все возможные файлы с помощью fopen
независимо от того, какая локаль была установлена и/или какие байты были помещены в строку, поскольку ни одна из доступных локалей не могла воспроизводить все возможные символы UTF-16. Эта проблема также применима ко всем другим API, которые принимают или возвращают 8-битные строки, включая API Windows, такие как SetWindowText
.
Программам, которые хотели использовать UTF-8, в частности код, предназначенный для переносимости в другие операционные системы, требовалось обходное решение этого недостатка. Обычным обходным путем было добавление новых функций для открытия файлов, которые преобразуют UTF-8 в UTF-16 с использованием MultiByteToWideChar , и вызова «широкой» функции вместо fopen
. [11] Десятки мультиплатформенных библиотек добавили функции-обертки для выполнения этого преобразования в Windows (и передачи UTF-8 без изменений в других), примером является предлагаемое дополнение к Boost , Boost.Nowide . [12] Другим популярным решением было преобразование имени в эквивалент имени файла версии 8.3. Это необходимо, если fopen
находится внутри библиотеки. Ни один из этих обходных путей не считается хорошим, поскольку они требуют внесения изменений в код, который работает не в Windows.
В апреле 2018 г. (или, возможно, ноябре 2017 г.) [13] ), в инсайдерской сборке 17035 (номинальная сборка 17134) для Windows 10 появился флажок «Бета-версия: использовать Unicode UTF-8 для поддержки языков по всему миру» для установки кодовой страницы языкового стандарта в UTF-8. [а] Это позволяет вызывать «узкие» функции, в том числе fopen
и SetWindowTextA
, со строками UTF-8. Однако это общесистемный параметр, и программа не может предположить, что он установлен.
В мае 2019 года Microsoft добавила возможность программе самой устанавливать кодовую страницу UTF-8. [1] [14] позволяя запускать программы, написанные с использованием UTF-8, неопытными пользователями.
По состоянию на 2019 год [update], Microsoft рекомендует программистам использовать UTF-8 (например, вместо любой другой 8-битной кодировки), [1] в Windows и Xbox и, возможно, рекомендует использовать его вместо UTF-16, даже заявляя, что «UTF-8 — это универсальная кодовая страница для интернационализации [и] UTF-16 [..] — это уникальное бремя, которое Windows возлагает на код, который нацелен на несколько платформ». [2] Похоже, что Microsoft действительно переходит на UTF-8, заявляя, что ранее подчеркивала свою альтернативу, а в Windows 11 некоторые системные файлы должны использовать UTF-8 и не требуют отметки порядка байтов. [15] Блокнот теперь может распознавать UTF-8 без метки порядка байтов, и ему можно указать написать UTF-8 без метки порядка байтов. [ нужна ссылка ] Некоторые другие продукты Microsoft используют UTF-8 внутри, включая Visual Studio. [ нужна ссылка ] и их SQL Server 2019 , причем Microsoft заявляет об увеличении скорости на 35% за счет использования UTF-8 и «почти на 50% снижении требований к хранению». [16]
Платформы программирования
[ редактировать ]До 2019 года компиляторы Microsoft не могли создавать строковые константы UTF-8 из исходных файлов UTF-8. Это связано с тем, что они преобразуют все строки в кодовую страницу локали (которая не может быть UTF-8). Когда-то единственным способом обойти это было выключение UNICODE и не отмечать входной файл как UTF-8 (т. е. не использовать спецификацию ). [17] [ устаревший источник ] Это заставит компилятор думать, что и входные, и выходные данные находятся в одной и той же однобайтовой локали, и строки останутся нетронутыми. В современных системах помогает установка кодовой страницы UTF-8.
См. также
[ редактировать ]- Буш скрыл факты , зашифровав текст моджибаке
Примечания
[ редактировать ]- ^ Находится в панели управления, пункт «Регион», вкладка «Администратор», кнопка «Изменить языковой стандарт системы».
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с «Используйте кодовые страницы UTF-8 в приложениях Windows» . Learn.microsoft.com . Проверено 6 июня 2020 г.
Начиная с версии Windows 1903 (обновление от мая 2019 г.), вы можете использовать свойство ActiveCodePage в appxmanifest для упакованных приложений или манифест Fusion для неупакованных приложений, чтобы заставить процесс использовать UTF-8 в качестве кодовой страницы процесса. [...]
CP_ACP
приравнивается кCP_UTF8
только при работе в Windows версии 1903 (обновление от мая 2019 г.) или более поздней версии, а описанному выше свойству ActiveCodePage присвоено значение UTF-8. В противном случае он учитывает кодовую страницу устаревшей системы. Мы рекомендуем использоватьCP_UTF8
явно. - ^ Перейти обратно: а б «Поддержка UTF-8 в Microsoft Game Development Kit (GDK) — Microsoft Game Development Kit» . Learn.microsoft.com . 19 августа 2022 г. Проверено 05 марта 2023 г.
Работая в UTF-8, вы можете обеспечить максимальную совместимость [..] Windows изначально работает в UTF-16 (или WCHAR), что требует преобразования кодовых страниц с помощью MultiByteToWideChar и WideCharToMultiByte. Это уникальное бремя, которое Windows возлагает на код, предназначенный для нескольких платформ. [..] Microsoft Game Development Kit (GDK) и Windows в целом продвигаются вперед к поддержке UTF-8, чтобы устранить это уникальное бремя Windows по нацеливанию кода или взаимообмену с несколькими платформами и Интернетом. Кроме того, это приводит к меньшему количеству проблем с интернационализацией в приложениях и играх и уменьшает матрицу тестов, необходимую для правильной работы.
- ^ «Юникод в Windows API» . Проверено 7 мая 2018 г.
- ^ «Соглашения для прототипов функций (Windows)» . MSDN . Проверено 7 мая 2018 г.
- ^ «Поддержка многобайтовых наборов символов (MBCS)» . Проверено 15 июня 2020 г.
- ^ «Наборы двухбайтовых символов» . MSDN . 31 мая 2018 г. Проверено 15 июня 2020 г.
наши приложения используют кодовые страницы DBCS Windows с версиями функций Windows «A».
- ^ _strrev, _wcsrev, _mbsrev, _mbsrev_l Microsoft Docs
- ^ «Различия между реализациями TAPI в Windows CE и Windows NT» . MSDN . 28 августа 2006 г. Проверено 7 мая 2018 г.
Windows CE основана на Unicode. Возможно, вам придется перекомпилировать исходный код, написанный для приложения на базе Windows NT.
- ^ «Кодовые страницы (Windows CE 5.0)» . Документы Майкрософт . 14 сентября 2012 года . Проверено 7 мая 2018 г.
- ^ «Идентификаторы кодовых страниц (Windows)» . msdn.microsoft.com . 7 января 2021 г.
- ^ «UTF-8 в Windows» . Переполнение стека . Проверено 1 июля 2011 г.
- ^ «Boost.Nowide» . Гитхаб .
- ^ «Windows10 Insider Preview, сборка 17035, поддерживает UTF-8 как ANSI» . Хакерские новости . Проверено 7 мая 2018 г.
- ^ «Windows 10 1903 и более поздние версии наконец-то поддерживают UTF-8 с формами A функций Win32» .
- ^ «Настройка меню «Пуск» Windows 11» . docs.microsoft.com . Проверено 29 июня 2021 г.
Убедитесь, что ваш LayoutModification.json использует кодировку UTF-8.
- ^ «Представляем поддержку UTF-8 для SQL Server» . techcommunity.microsoft.com . 2019-07-02 . Проверено 24 августа 2021 г.
Например, изменение существующего типа данных столбца с NCHAR(10) на CHAR(10) с использованием параметров сортировки с поддержкой UTF-8 приводит к сокращению требований к памяти почти на 50%. [..] В диапазоне ASCII при интенсивном вводе-выводе чтения/записи в UTF-8 мы измерили среднее улучшение производительности на 35 % по сравнению с UTF-16 с использованием кластеризованных таблиц с некластеризованным индексом в строковом столбце и повышение производительности в среднем на 11 % по сравнению с UTF-16 при использовании кучи.
- ^ Часто задаваемые вопросы по UTF-8 везде: как написать строковый литерал UTF-8 в коде C++?
Внешние ссылки
[ редактировать ]- «Юникод» . MSDN . Майкрософт . Проверено 10 ноября 2016 г.