WikiDer > Юникод в 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 ++?

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