Юникод в Microsoft Windows - Unicode in Microsoft Windows
эта статья нужны дополнительные цитаты для проверка.Июнь 2011 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
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]
Эта секция нуждается в расширении. Вы можете помочь добавляя к этому. (Июнь 2011 г.) |
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 оставят байты в строке в кавычках без изменений.
Смотрите также
- Буш скрыл факты, кодировка текста моджибаке
Примечания
- ^ Находится под панелью управления, записью «Регион», вкладкой «Администрирование», кнопкой «Изменить язык системы».
Рекомендации
- ^ а б «Используйте кодовую страницу 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
явно. - ^ «Юникод в Windows API». Получено 7 мая 2018.
- ^ «Соглашения для прототипов функций (Windows)». MSDN. Получено 7 мая 2018.
- ^ «Поддержка многобайтовых наборов символов (MBCS)». Получено 2020-06-15.
- ^ «Наборы двухбайтовых символов». MSDN. 2018-05-31. Получено 2020-06-15.
наши приложения используют кодовые страницы DBCS Windows с "A" версиями функций Windows.
- ^ _strrev, _wcsrev, _mbsrev, _mbsrev_l Документы Microsoft
- ^ «Различия между реализациями TAPI в Windows CE и Windows NT». MSDN. Получено 7 мая 2018.
Windows CE основана на Unicode. Возможно, вам придется перекомпилировать исходный код, написанный для приложения на базе Windows NT.
- ^ «Кодовые страницы (Windows CE 5.0)». Документы Microsoft. Получено 7 мая 2018.
- ^ «Идентификаторы кодовой страницы (Windows)». msdn.microsoft.com.
- ^ "Windows10 Insider Preview Build 17035 поддерживает UTF-8 как ANSI". Хакерские новости. Получено 7 мая 2018.
- ^ Форумы MSDN
- ^ «UTF-8 в Windows». Переполнение стека. Получено 1 июля, 2011.
- ^ "Boost.Nowide".
- ^ "Увеличить список рассылки".
- ^ UTF-8 Everywhere FAQ: Как мне написать строковый литерал UTF-8 в моем коде C ++?