Добавление поддержки юникода в библиотеку для Windows - PullRequest
3 голосов
/ 30 июня 2010

Я хотел бы добавить поддержку Unicode в библиотеку C, которую я поддерживаю.В настоящее время ожидается, что все строки будут переданы в кодировке utf8.Судя по отзывам, Windows обычно предоставляет 3 версии функций.

  • fooA () строки в кодировке ANSI
  • fooW () строки в кодировке Unicode
  • кодировка строк foo ()зависит от UNICODE define

Есть ли простой способ добавить эту поддержку без написания большого количества функций-обёрток?Некоторые функции могут вызываться из библиотеки и пользователем, и это немного усложняет ситуацию.

Я бы хотел сохранить поддержку строк utf8, поскольку библиотека может использоваться в нескольких операционных системах.

Ответы [ 2 ]

4 голосов
/ 30 июня 2010

Функции foo без суффикса на самом деле являются макросами.Функции fooA устарели и являются простыми обертками вокруг функций fooW, которые являются единственными, которые фактически выполняют работу.Windows использует строки UTF-16 для всего, поэтому, если вы хотите продолжить использовать строки UTF-8, вы должны конвертировать их для каждого вызова API (например, с помощью MultiByteToWideChar).

Для открытого интерфейса вашей библиотекипридерживайтесь только одной кодировки: UTF-16, UTF-32 или UTF-8.Все остальное (зависящее от локали или от ОС) слишком сложно для вызывающих.Вам не нужен UTF-8 для совместимости с другими ОС: многие независимые от платформы библиотеки, такие как ICU, Qt или стандартные библиотеки Java, используют UTF-16 во всех системах.Я думаю, что выбор между тремя кодировками Unicode зависит от того, какую ОС вы ожидаете, библиотека будет использоваться чаще всего: если она будет в основном использоваться в Windows, придерживайтесь UTF-16, чтобы вы могли избежать всех преобразований строк.В Linux UTF-8 является обычным выбором в качестве кодировки файловой системы или терминала (поскольку это единственная кодировка Unicode с 8-битным символьным блоком), но см. Примечание выше относительно библиотек.OS X использует UTF-8 для своего интерфейса POSIX и UTF-16 для всего остального (Carbon, Cocoa).

Некоторые замечания по терминологии: слова «ANSI» и «Unicode», используемые в документации Microsoft,не в соответствии с тем, что говорят международные стандарты.Когда Microsoft говорит о «Юникоде» или «широких символах», они означают «UTF-16» или (исторически) его подмножество BMP (с одной единицей кода на кодовую точку).«ANSI» на языке Microsoft означает некую устаревшую кодировку, зависящую от локали, которая полностью устарела во всех современных версиях Windows.

Если вам нужна четкая рекомендация, перейдите на UTF-16 и библиотеку ICU.

1 голос
/ 30 июня 2010

Поскольку вашей библиотеке уже требуются строки в кодировке UTF-8, она уже полностью поддерживает Unicode, поскольку UTF-8 - это кодировка Unicode без потерь. Если вы хотите использовать свою библиотеку в среде, в которой обычно используются строки UTF-16 или даже строки UTF-32, тогда она может просто кодировать и декодировать из UTF-8 при разговоре с вашей библиотекой. В противном случае вашей библиотеке пришлось бы предоставлять дополнительные функции UTF-16/32, которые выполняют эти операции кодирования / декодирования внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...