2010-07-12 7 views
4

Я получаю argv как wchar_t ** (см. Ниже), потому что мне нужно работать с unicode, но мне нужно преобразовать его в char **. Как я могу это сделать?Как преобразовать wchar_t ** в char **?

int wmain(int argc, wchar_t** argv) 
{ 
+2

У вас нет :-p Я сильно за то, что делаю всю работу в Юникоде, когда это то, что вам дали. Вам просто нужно выделить 'char ** myArgs = new char * [argc];' и затем пропустить argv, преобразовывая каждую строку за раз, а затем заполняя 'myArgs' преобразованной строкой - я ожидаю, что кто-то даст вам код для этого поэтому я не отправляю ответ. Но, пожалуйста, подумайте об обратном - измените код, который потребляет char **, чтобы принять wchar_t **. – Rup

+2

Преобразование, так как я забыл упомянуть об этом, выполняется с помощью 'WideCharToMultiByte' или' wcstombs' (предпочитает версию '_s'). Но вам нужно выделить буфер для получения строки и, возможно, изменить ее размер, если вы ошибаетесь - я не писал код, потому что не могу вспомнить, есть ли простой или простой способ сделать это. Проще всего просто нацелиться на высокий уровень. – Rup

+0

Спасибо, что вы говорите о вещах, которые вы точно знаете, а не притворяетесь, что знаете и можете все. Так что +2 за твою скромность! – Narek

ответ

4

Там больше чем один способ сделать это. В зависимости от среды и доступных компиляторов/стандартные библиотеки/другие библиотеки, у вас есть по крайней мере три варианта:

  1. Использование станд :: локали и станд :: codecvt <> фасетов;
  2. использовать функции языка C, такие как std :: mbstowcs();
  3. Использование сторонних функций, таких как iconv() on * nix или WideCharToMultiByte() в Windows.

Вам действительно нужно сделать преобразование?

Вы должны понимать, что часто (особенно в Windows) преобразование из строки wchar_t в строку символов представляет собой преобразование с потерями. Набор символов, используемый системой для строковых символов, часто не является UTF-8. Например. если вы конвертируете имя файла с национальными символами или на каком-то азиатском языке в строку символов, скорее всего, вы получите то, что не будет действительно полезным для доступа к исходному файлу.

1

Это делает трюк:

#define MAXLEN 512 
    char tx[MAXLEN]; 
    mbstowcs(argv[i], tx, MAXLEN); 
0

Зачем вам нужно преобразовать? В большинстве случаев вам нужно изменить настройки своего проекта, чтобы все принимали широкие символы. Если в сторонней библиотеке требуется строка, отличная от Юникода, вам необходимо перекомпилировать ее с соответствующими параметрами для Unicode. Если нет подходящих параметров для Unicode, я бы избавился от этой библиотеки и нашел (напишу) лучший.

Смежные вопросы