Юникод в Microsoft Windows - Unicode in Microsoft Windows

Microsoft была одной из первых компаний, внедривших Unicode в своих продуктах. Windows NT была первой операционной системой, которая использовала "широкие символы" в системные вызовы. С использованием UCS-2 схема кодирования сначала была обновлена ​​до UTF-16 начиная с Windows 2000, что позволяет отображать дополнительные плоскости с суррогатными парами. Тем не менее Microsoft не смогла поддержать UTF-8 до 2017 года. В мае 2019 года Microsoft изменила курс и начала рекомендовать использование исключительно UTF-8.[1]

В различных семействах Windows

Системы на базе Windows NT

Текущие версии Windows и все обратно в Windows XP и ранее Windows NT (3.x, 4.0) поставляются с системные библиотеки эта опорная строка кодирование двух типов: 16-битный «Юникод» (UTF-16 поскольку Windows 2000 ) и (иногда многобайтовой) кодировки, называемой "кодовая страница "(или неправильно именуется ANSI кодовая страница). 16-битные функции имеют имена с суффиксом 'W' (от "широкий" ) Такие как SetWindowTextW. Функции, ориентированные на кодовую страницу, используют суффикс 'A' для ANSI, например SetWindowTextA (некоторые другие соглашения использовались для API, которые были скопированы из других систем, например _wfopen / fopen или wcslen / strlen). Это разделение было необходимо, потому что многие языки, включая C, не обеспечивает простой способ передачи 8-битных и 16-битных строк одной и той же функции.

Функции «А» реализованы как обертки который переводит текст с использованием текущей кодовой страницы в UTF-16, а затем вызывает функцию 'W'.[нужна цитата ] Функции 'A', возвращающие строки, выполняют противоположное преобразование, превращая символы, которых нет в текущем языковом стандарте, в '?'.

Microsoft попытался «переносимо» поддерживать Unicode, предоставив компилятору переключатель «UNICODE», который переключает нефиксированные «общие» вызовы с интерфейса «A» на интерфейс «W» и преобразует все строковые константы в «широкие» версии UTF-16.[2][3] На самом деле это не работает, потому что он не переводит UTF-8 за пределы строковых констант, в результате чего код, который пытается открывать файлы, просто не компилируется.[нужна цитата ]

Ранее, независимо от переключателя «UNICODE», Windows также предоставляла переключатель API многобайтовых наборов символов (MBCS).[4] Это меняет некоторые функции, которые не работают в MBCS, например strrev к MBCS-осведомленным, таким как _mbsrev.[5][6]

В документации Microsoft термин «Unicode» используется для обозначения «не 8-битной кодировки».[нужна цитата ]

Windows CE

В Windows CE, UTF-16 использовался почти исключительно, а API A практически отсутствовал.[7] Ограниченный набор ANSI API доступен в Windows CE 5.0 для использования в сокращенном наборе локалей, которые могут быть выборочно встроены в образ среды выполнения.[8]

Windows 9x

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

UTF-8

В Microsoft Windows есть кодовая страница, предназначенная для UTF-8, кодовая страница 65001.[9] До Windows 10 Insider build 17035 (ноябрь 2017 г.)[10] было невозможно установить кодовую страницу локали на 65001, оставляя эту кодовую страницу доступной только для (а) явных функций преобразования, таких как MultiByteToWideChar и / или (б) Консоль Win32 команда chcp 65001 для перевода stdin / out между UTF-8 и UTF-16. Это означает, что «узкие» функции, в частности fopen (который открывает файлы), не может быть вызван со строками UTF-8, и на самом деле нет возможности открыть все возможные файлы с помощью fopen независимо от того, какой языковой стандарт установлен и / или какие байты помещены в строку, поскольку ни один из доступных языковых стандартов не может воспроизводить все возможные символы UTF-16. Эта проблема также относится ко всем другим api, которые принимают или возвращают 8-битные строки, включая строки Windows, такие как SetWindowText.

Microsoft заявила, что локаль UTF-8 может сломаться немного функции, поскольку они были написаны, предполагают, что многобайтовые кодировки используют не более 2 байтов на символ, поэтому кодовые страницы с большим количеством байтов, такие как UTF-8 (а также ГБ 18030, cp54936) не удалось установить в качестве языкового стандарта.[11]

На всех современных платформах, отличных от Windows, строка имени файла передается в fopen эффективно UTF-8. Это приводит к несовместимости между другими платформами и Windows. Обычный обходной путь - добавить специфичный для Windows код для преобразования UTF-8 в UTF-16, используя MultiByteToWideChar и вызовем "широкую" функцию вместо fopen.[12] Другой популярный обходной путь - преобразовать имя в 8.3 имя файла эквивалентно, это необходимо, если fopen находится внутри библиотечной функции, которая принимает строковое имя файла, поэтому вызов другой функции невозможен. Также были предложения добавить новые API в переносимые библиотеки, такие как Увеличение сделать необходимое преобразование, добавив новые функции для открытия и переименования файлов. Эти функции будут передавать имена файлов без изменений в Unix, но переводить их в UTF-16 в Windows. Такая вот библиотека Boost.Nowide[13], был принят в Boost[14] и будет частью выпуска 1.73. Это позволило бы коду быть «переносимым», но требовало столько же изменений кода, сколько и вызов широких функций.

В апреле 2018 года с инсайдерской сборкой 17035 (номинальная сборка 17134) для Windows 10 появился флажок «Бета: использовать Unicode UTF-8 для всемирной языковой поддержки» для установки кодовой страницы локали в UTF-8.[а] Это позволяет вызывать "узкие" функции, в том числе fopen и SetWindowTextA, со строками UTF-8. В мае 2019 года Microsoft добавила в программу возможность устанавливать кодовую страницу для самой UTF-8 и начала рекомендовать, чтобы все программы делали это и использовали исключительно UTF-8.[1]

Платформы программирования

Компиляторы Microsoft часто не могут создавать строковые константы UTF-8 из исходных файлов UTF-8. Самый надежный метод - повернуть выключен UNICODE, нет пометьте входной файл как UTF-8 (т.е. не используйте Спецификация ) и расположите строковые константы так, чтобы они имели байты UTF-8. Если была добавлена ​​спецификация, компилятор Microsoft интерпретирует строки как UTF-8, преобразует их в UTF-16, а затем преобразует их. назад в текущую локаль, тем самым разрушив UTF-8.[15] Без спецификации и с использованием однобайтовой локали компиляторы Microsoft оставят байты в строке в кавычках без изменений.

Смотрите также

Примечания

  1. ^ Находится под панелью управления, записью «Регион», вкладкой «Администрирование», кнопкой «Изменить язык системы».

Рекомендации

  1. ^ а б «Используйте кодовую страницу Windows UTF-8 - приложения UWP». docs.microsoft.com. Получено 2020-06-06. Начиная с версии Windows 1903 (обновление за май 2019 г.), вы можете использовать свойство ActiveCodePage в appxmanifest для упакованных приложений или манифест слияния для неупакованных приложений, чтобы заставить процесс использовать UTF-8 в качестве кодовой страницы процесса. [..] CP_ACP приравнивается к CP_UTF8 только если вы работаете в Windows версии 1903 (обновление за май 2019 г.) или выше и для свойства ActiveCodePage, описанного выше, задано значение UTF-8. В противном случае учитывается устаревшая системная кодовая страница. Мы рекомендуем использовать CP_UTF8 явно.
  2. ^ «Юникод в Windows API». Получено 7 мая 2018.
  3. ^ «Соглашения для прототипов функций (Windows)». MSDN. Получено 7 мая 2018.
  4. ^ «Поддержка многобайтовых наборов символов (MBCS)». Получено 2020-06-15.
  5. ^ «Наборы двухбайтовых символов». MSDN. 2018-05-31. Получено 2020-06-15. наши приложения используют кодовые страницы DBCS Windows с "A" версиями функций Windows.
  6. ^ _strrev, _wcsrev, _mbsrev, _mbsrev_l Документы Microsoft
  7. ^ «Различия между реализациями TAPI в Windows CE и Windows NT». MSDN. Получено 7 мая 2018. Windows CE основана на Unicode. Возможно, вам придется перекомпилировать исходный код, написанный для приложения на базе Windows NT.
  8. ^ «Кодовые страницы (Windows CE 5.0)». Документы Microsoft. Получено 7 мая 2018.
  9. ^ «Идентификаторы кодовой страницы (Windows)». msdn.microsoft.com.
  10. ^ "Windows10 Insider Preview Build 17035 поддерживает UTF-8 как ANSI". Хакерские новости. Получено 7 мая 2018.
  11. ^ Форумы MSDN
  12. ^ «UTF-8 в Windows». Переполнение стека. Получено 1 июля, 2011.
  13. ^ "Boost.Nowide".
  14. ^ "Увеличить список рассылки".
  15. ^ UTF-8 Everywhere FAQ: Как мне написать строковый литерал UTF-8 в моем коде C ++?

внешняя ссылка