Как конвертировать wchar_t ** в char **? - PullRequest
4 голосов
/ 12 июля 2010

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

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

Ответы [ 3 ]

4 голосов
/ 12 июля 2010

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

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

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

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

1 голос
/ 12 июля 2010

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

#define MAXLEN 512
   char tx[MAXLEN];
   mbstowcs(argv[i], tx, MAXLEN);
0 голосов
/ 14 июля 2010

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

...