Я получаю argv как wchar_t ** (см. Ниже), потому что мне нужно работать с unicode, но мне нужно преобразовать его в char **. Как я могу это сделать?Как преобразовать wchar_t ** в char **?
int wmain(int argc, wchar_t** argv)
{
Я получаю argv как wchar_t ** (см. Ниже), потому что мне нужно работать с unicode, но мне нужно преобразовать его в char **. Как я могу это сделать?Как преобразовать wchar_t ** в char **?
int wmain(int argc, wchar_t** argv)
{
Там больше чем один способ сделать это. В зависимости от среды и доступных компиляторов/стандартные библиотеки/другие библиотеки, у вас есть по крайней мере три варианта:
Вам действительно нужно сделать преобразование?
Вы должны понимать, что часто (особенно в Windows) преобразование из строки wchar_t в строку символов представляет собой преобразование с потерями. Набор символов, используемый системой для строковых символов, часто не является UTF-8. Например. если вы конвертируете имя файла с национальными символами или на каком-то азиатском языке в строку символов, скорее всего, вы получите то, что не будет действительно полезным для доступа к исходному файлу.
Это делает трюк:
#define MAXLEN 512
char tx[MAXLEN];
mbstowcs(argv[i], tx, MAXLEN);
Зачем вам нужно преобразовать? В большинстве случаев вам нужно изменить настройки своего проекта, чтобы все принимали широкие символы. Если в сторонней библиотеке требуется строка, отличная от Юникода, вам необходимо перекомпилировать ее с соответствующими параметрами для Unicode. Если нет подходящих параметров для Unicode, я бы избавился от этой библиотеки и нашел (напишу) лучший.
У вас нет :-p Я сильно за то, что делаю всю работу в Юникоде, когда это то, что вам дали. Вам просто нужно выделить 'char ** myArgs = new char * [argc];' и затем пропустить argv, преобразовывая каждую строку за раз, а затем заполняя 'myArgs' преобразованной строкой - я ожидаю, что кто-то даст вам код для этого поэтому я не отправляю ответ. Но, пожалуйста, подумайте об обратном - измените код, который потребляет char **, чтобы принять wchar_t **. – Rup
Преобразование, так как я забыл упомянуть об этом, выполняется с помощью 'WideCharToMultiByte' или' wcstombs' (предпочитает версию '_s'). Но вам нужно выделить буфер для получения строки и, возможно, изменить ее размер, если вы ошибаетесь - я не писал код, потому что не могу вспомнить, есть ли простой или простой способ сделать это. Проще всего просто нацелиться на высокий уровень. – Rup
Спасибо, что вы говорите о вещах, которые вы точно знаете, а не притворяетесь, что знаете и можете все. Так что +2 за твою скромность! – Narek