Jump to content

Юникод в Microsoft Windows

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 UTF-16 использовался почти исключительно, при этом API «A» в основном отсутствовал. [8] В Windows CE 5.0 доступен ограниченный набор API-интерфейсов ANSI для использования в сокращенном наборе локалей, которые можно выборочно встраивать в образ среды выполнения. [9]

В 2001 году Microsoft выпустила специальное дополнение к старым системам Microsoft Windows 9x . Он включает в себя динамическую библиотеку unicows.dll (всего 240 КБ), содержащую 16-битную версию (те, что с буквой W на конце) всех основных функций Windows API. Это всего лишь слой перевода: SetWindowTextW просто преобразует свои входные данные, используя текущую кодовую страницу, и вызовет SetWindowTextA.

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 год , 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.

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Находится в панели управления, пункт «Регион», вкладка «Администратор», кнопка «Изменить языковой стандарт системы».
  1. ^ Перейти обратно: а б с «Используйте кодовые страницы 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 явно.
  2. ^ Перейти обратно: а б «Поддержка 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 по нацеливанию кода или взаимообмену с несколькими платформами и Интернетом. Кроме того, это приводит к меньшему количеству проблем с интернационализацией в приложениях и играх и уменьшает матрицу тестов, необходимую для правильной работы.
  3. ^ «Юникод в Windows API» . Проверено 7 мая 2018 г.
  4. ^ «Соглашения для прототипов функций (Windows)» . MSDN . Проверено 7 мая 2018 г.
  5. ^ «Поддержка многобайтовых наборов символов (MBCS)» . Проверено 15 июня 2020 г.
  6. ^ «Наборы двухбайтовых символов» . MSDN . 31 мая 2018 г. Проверено 15 июня 2020 г. наши приложения используют кодовые страницы DBCS Windows с версиями функций Windows «A».
  7. ^ _strrev, _wcsrev, _mbsrev, _mbsrev_l Microsoft Docs
  8. ^ «Различия между реализациями TAPI в Windows CE и Windows NT» . MSDN . 28 августа 2006 г. Проверено 7 мая 2018 г. Windows CE основана на Unicode. Возможно, вам придется перекомпилировать исходный код, написанный для приложения на базе Windows NT.
  9. ^ «Кодовые страницы (Windows CE 5.0)» . Документы Майкрософт . 14 сентября 2012 года . Проверено 7 мая 2018 г.
  10. ^ «Идентификаторы кодовых страниц (Windows)» . msdn.microsoft.com . 7 января 2021 г.
  11. ^ «UTF-8 в Windows» . Переполнение стека . Проверено 1 июля 2011 г.
  12. ^ «Boost.Nowide» . Гитхаб .
  13. ^ «Windows10 Insider Preview, сборка 17035, поддерживает UTF-8 как ANSI» . Хакерские новости . Проверено 7 мая 2018 г.
  14. ^ «Windows 10 1903 и более поздние версии наконец-то поддерживают UTF-8 с формами A функций Win32» .
  15. ^ «Настройка меню «Пуск» Windows 11» . docs.microsoft.com . Проверено 29 июня 2021 г. Убедитесь, что ваш LayoutModification.json использует кодировку UTF-8.
  16. ^ «Представляем поддержку 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 при использовании кучи.
  17. ^ Часто задаваемые вопросы по UTF-8 везде: как написать строковый литерал UTF-8 в коде C++?
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a7608faff008fb97c60e91103a2fc8b5__1722192840
URL1:https://arc.ask3.ru/arc/aa/a7/b5/a7608faff008fb97c60e91103a2fc8b5.html
Заголовок, (Title) документа по адресу, URL1:
Unicode in Microsoft Windows - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)