Можно ли использовать Unicode «argv»?
=====================================

Я пишу небольшую оболочку для приложения, которое использует файлы в качестве аргументов.

Оболочка должна быть в Unicode, поэтому яЯ использую wchar\_t для символов и строк, которые у меня есть. Теперь я нахожусь в проблеме, мне нужно иметь аргументы программы в массиве wchar\_t 's и в строке wchar\_t.

Является ли это возможным? Я'м, определяющий`main` функционировать как

Должен ли я использовать wchar\_t 'с?`argv`

Большое спасибо, я не вижу полезной информации о том, как правильно использовать Unicode в C.

 но стандарт C говорит, что аргументыглавный()' должно быть 'main (int argc, char ** argv) ' или эквивалентный, поэтому если char и wchar\_t не имеют одинаковый базовый тип, вы можете 'не делай этого.

Сказав это, вы можете получить в программу строки аргументов UTF-8, преобразовать их в UTF-16 или UTF-32, а затем продолжить жизнь.

На Mac (10.5.8, Leopard) я получил:

Тот'Все в кодировке UTF-8. (odx - это программа шестнадцатеричного дампа).

Смотрите также:[Почему при взаимодействии со средой UNIX / Linux используется кодировка UTF-8?](https://stackoverflow.com/questions/164430/)



`GetCommandLineW()` а также`CommandLineToArgvW()` производить в стиле argv`wchar_t[]` массив, даже если приложение не скомпилировано для Unicode.



 которые будут превращены в wmain, если символ \_UNICODE определен во время компиляции, или main в противном случае. TCHAR * argv [] также будет расширен до WCHAR * argv [], если определен юникод, и char * argv [], если нет.

Если вы хотите, чтобы ваш основной метод работал кроссплатформенно, вы можете определить свои собственные макросы с таким же эффектом.

TCHAR.h содержит несколько удобных макросов для преобразования между wchar и char.



 что ваша среда Linux использует кодировку UTF-8, следующий код подготовит вашу программу к простой обработке Unicode в C ++:

Далее, тип wchar\_t является 32-битным в Linux, что означает, что он может содержать отдельные кодовые точки Unicode, и вы можете безопасно использовать тип wstring для классической обработки строк в C ++ (символ за символом). При вызове setlocale, приведенном выше, вставка в wcout автоматически переведет ваш вывод в UTF-8, а извлечение из wcin автоматически переведет ввод UTF-8 в UTF-32 (1 символ = 1 кодовая точка). Единственная проблема, которая остается, состоит в том, что строки argv [i] все еще в кодировке UTF-8.

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



ает использование`wmain` вместо`main`, в этом случае argv передается как широкие символы.



`wmain()` для UNICODE строит. Не портативный хотя. Я не знаю, если платформы GCC или Unix / Linux предоставляют что-то подобное.