Если вы хотите использовать широкие строки, 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).