wchar_t argv в C - Unicode - PullRequest
       26

wchar_t argv в C - Unicode

1 голос
/ 09 марта 2011

Поддерживает ли GCC Microsoft аналог wmain ()? Я пишу программу на C, и мне нужно использовать Unicode. Если нет, можно ли преобразовать char в wchar_t?

Ответы [ 4 ]

7 голосов
/ 09 марта 2011

Вам не нужно wchar_t для Unicode. Вы можете использовать char для кодировки Unicode utf-8. Плюс, wchar_t может быть разных размеров. В Windows это 16 бит, но на многих платформах Linux / Unix это 32 бит.

Подробнее о GCC см. В этом сообщении, которое я нашел с помощью поиска Google:

http://article.gmane.org/gmane.comp.gnu.mingw.user/22962

(В соответствии с этим ответом на ваш вопрос о том, поддерживает ли GCC wmain, является «нет».)

2 голосов
/ 09 марта 2011

Многие из стандартных строковых функций C не зависят от кодировки.Вы можете использовать char* для хранения строк в кодировке UTF-8 и безопасного их использования с:

strcpy strncpy strcat strncat strcmp strncmp strdup strchr 
strrchr strcspn strspn strpbrk strstr strtok

Некоторые другие функции не будут давать правильные результаты со строками Unicode.Например, strlen всегда считает байты, а не символы.Количество символов можно посчитать в C в переносном виде, используя mbstowcs(NULL,s,0).Он вернет количество символов в s, успешно переведенных в wchar_t.Это работает для UTF-8, как и для любой другой поддерживаемой кодировки, если выбран соответствующий языковой стандарт.

Если вы хотите выполнять расширенные операции со строками Unicode, такие как сложные преобразования кодовых страниц, регулярные выражения, перенос текстана границах слов и т. д., я предлагаю вам использовать хорошую библиотеку, такую ​​как ICU .

См .: Использование Unicode в C / C ++ .

0 голосов
/ 15 августа 2013

Если вы хотите использовать широкие строки, mbstowcs преобразует многобайтовую строку в строку wchar_t.Кодировка, в которой предполагается, что многобайтовая строка находится в зависимости от категории LC_CTYPE текущей локали.Необходимо установить это с помощью setlocale;в противном случае вы получите локаль «C» по умолчанию.

Остается вопрос о том, какая кодировка символов используется в argv.Это может быть UTF-8 или одна из однобайтовых кодировок, например Latin-1.Это зависит от настроек вашего терминала.Экспериментируя с xterm, я получил разные значения для argv, когда я передал «é» в командной строке, в зависимости от значения LANG, которое унаследовал xterm: для LANG = en_US.UTF-8 он дал «c3 a9»;для LANG = en_US он дал «e9» (я думаю, что это Latin-1.)

Вы можете получить локаль из окружения сначала с помощью setlocale(LC_CTYPE, "") или setlocale(LC_ALL, ""), чтобы использовать правильный многобайтовыйформат (устанавливается из переменных среды).Однако у вас могут возникнуть проблемы, если после запуска эмулятора терминала изменить язык LANG.

glibc предоставляет несколько других функций для преобразования набора символов, которые могут быть более подходящими - см. Раздел «Обработка набора символов» в руководстве по glibcдля дополнительной информации.Мой опыт показывает, что преобразование строки в argv в заданную кодировку довольно сложно, и, возможно, ее придется выполнить в два этапа: один раз преобразовать ее в формат wchar_t, а затем преобразовать ее из wchar_t в требуемую кодировку.(например, UTF-8).

0 голосов
/ 13 марта 2011

Если вы хотите обрабатывать аргументы командной строки Unicode без wmain, вы можете использовать стандартные main функции без аргументов и функции API Windows GetCommandLineW, CommandLineToArgvW и LocalFree.CommandLineToArgvW использует те же правила для синтаксического анализа командной строки , что и библиотека времени выполнения Microsoft.

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