Строки шириной 2 байта (UCS-2) в GCC

При портировании моего проекта Visual C++ в GCC я обнаружил, что тип данных wchar_t является 4-байтовым UTF-32 по умолчанию. Я мог бы переопределить это с помощью опции компилятора, но тогда вся часть RTL wcs * (wcslen, wcscmp и т. Д.) Становится непригодной для использования, так как она предполагает строки шириной 4 байта.

На данный момент я переопределил 5-6 этих функций с нуля и # определил мои реализации в. Но есть ли более элегантный вариант - скажем, сборка GCC RTL с 2-байтовым wchar-t, спокойно где-то сидящим, ожидая быть связанным?

Конкретные разновидности GCC, которые мне нужны, - это Xcode на Mac OS X, Cygwin и тот, который поставляется с Debian Linux Etch.

4 ответа

Решение

Повторно реализовано 5-6 более распространенных функций wcs*, # определены мои реализации в.

Но есть ли более элегантный вариант - скажем, сборка GCC RTL с 2-байтовым wchar-t, который тихо сидит где-то в ожидании соединения?

Нет. Это проблема конкретной платформы, а не проблема GCC.

То есть платформа Linux ABI определяет, что wchar_t имеет 32-битную ширину, поэтому вам нужно либо использовать совершенно новую библиотеку (для которой ICU является популярным выбором), либо перенести код для обработки 4-байтовых wchar_t s. Все библиотеки, на которые вы можете ссылаться, также будут содержать 4 байта wchar_t, и сломается, если вы используете GCC -fshort-wchar,

Но, в частности, для Linux, почти все стандартизировали UTF-8 для всех многобайтовых кодировок.

Посмотрите на библиотеку ICU. Это портативная библиотека с API UTF-16.

Как вы заметили, wchar_t определяется реализацией. Нет возможности переносить работу с этим типом данных.

Преимущество систем Linux в том, что они получили поддержку Unicode позже, после того, как весь разгром UCS-2 был объявлен не очень хорошей идеей, и в качестве кодировки использовался UTF-8. Все системные API по-прежнему работают на char* и безопасны для Unicode.

Лучше всего использовать библиотеку, которая управляет этим для вас: Qt, ICU и т. Д.

Обратите внимание, что Cygwin имеет 2-байтовый wchar_t для облегчения работы с Windows.

Другие вопросы по тегам