Преобразование из char * в wchar* не работает должным образом

Я получаю строку как: "aña!a¡a¿a?a" с сервера, поэтому я декодирую его, а затем передаю в функцию.

Что мне нужно сделать с сообщением, это что-то вроде загрузки путей в зависимости от букв.

Заголовок моей функции: void SetInfo(int num, char *descr[4]) поэтому он получает одно число и массив из 4 символов (предложений). Для простоты, скажем, мне просто нужно работать только с descr[0].

Когда я отлаживаю и прибываю туда в SetInfo(), я получаю точное сообщение в представлении отладки: "aña!a¡a¿a?a" так что пока тут все ок. Первоначально информация, которую я получал об этой функции, была std::wstring, поэтому весь мой код, работающий с этим сообщением, был с wstrings и strings, но теперь я получаю символ, как показано в заголовке. Сообщение пришло, пока здесь, хорошо, но если я хочу работать с ним, то я не могу, потому что, если я отлаживаю и вижу каждую позицию Descr[0], тогда я получаю

 descr[0][0] = 'a'; //ok
 descr[0][1] = 'Ã '; // BAD

поэтому я попытался преобразовать char* в wchar* с помощью кода, найденного здесь:

 size_t size = strlen(descr[0]) + 1;
 wchar_t* wa = new wchar_t[size];
 mbstowcs(wa,descr[0],size);

Но тогда отладчик показывает мне, что wa имеет:

wa wchar_t * 0x185d4be8 L"a-\uffffffff刯2e2e牵6365⽳6f73歯6f4c楲6553䈯736f獵6e6f档6946琯7361灭6569湰2e6f琀0067\021ᡰ9740슃b8\020\210=r"

что я полагаю, что это неправильно (я полагаю, что я должен увидеть то же самое начальное сообщение "aña!a¡a¿a?a", Если это сообщение в порядке, то я не знаю, как получить то, что мне нужно...)

Итак, мой вопрос: как я могу получить, что descr[0][0] = 'a' и descr[0][1] = 'ñ'?? Я не могу передать char в wchar (вы уже видите, что я получил). Я делаю это неправильно? Или есть другой способ? Я действительно застрял на этом, поэтому любая идея будет очень ценится.

Раньше, когда я работал с wstrings (и он работал так хорошо), я делал что-то вроде этого:

if (word[i]==L'\x00D1' or word[i]==L'\x00F1')  // ñ or Ñ
   path ="PathOfÑ";  

где слово [i] совпадает с descr [0] [1] в этом случае, но с wstrings. Поэтому я знал, что это слово [i] было буквой "ñ". Может быть, это помогает понять, что я делаю

(кстати... я работаю над затмением, над Linux.)

1 ответ

mbstowcs функция работает со строками в стиле C, и одна из особенностей строк в стиле C состоит в том, что они имеют специальный завершающий символ, '\0', Вы, кажется, не добавляете этот терминатор в строку, ведущую mbstowcs выйти за пределы фактической строки и дать вам неопределенное поведение.

Другие вопросы по тегам