Строки шириной 2 байта (UCS-2) в GCC - PullRequest
3 голосов
/ 07 мая 2010

при переносе моего проекта 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 ]

2 голосов
/ 07 мая 2010

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

Нет.Это проблема, специфичная для платформы, а не проблема GCC.

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

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

1 голос
/ 07 мая 2010

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

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

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

Обратите внимание, что в cygwin есть 2 байта wchar_t для упрощения работы с Windows.

1 голос
/ 07 мая 2010

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

0 голосов
/ 12 октября 2010

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

...