Как объединить строку Юникода в строку символов для передачи в вызов MySQL - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь объединить массив строк в массив символов - но одна из строк написана на иностранном языке (для чего мне нужен UTF8). Я могу увидеть строку UTF8 на соответствующем языке в отладчике (Visual Studio) после того, как я прочитал ее из базы данных и поместил в массив wxString, но когда я пытаюсь соединить строку с массивом, t никогда не помещается туда .

Я пробовал variable.mb_str () variable.mb.str (). Данные (). Ни один из них не работает в strcat для моих данных языка. Другие данные объединены в порядке. Все данные поступают из базы данных MariaDB.

 int i, numRows;
 wxString query;
 wxString sortby;
 wxString group_list;
 wxString *stringGroups;
 char holdString[400];

 /*   Try UTF Force */
 query.Printf(_("set names 'utf8'"));
 mysql_query(mDb, query.mb_str());
 result = mysql_store_result(mDb);
 mysql_free_result(result);
 query.Printf(_("select GROUP_NAME from USER_PERMS where USER_NAME = 
    \"%s\" 
 ORDER BY GROUP_NAME "),  riv_getuser().c_str() );
 mysql_query(mDb, query.mb_str());   
 result = mysql_store_result(mDb);
 numRows = mysql_num_rows(result);
 stringGroups = new wxString[numRows + 1];
 i = 0; 
 while ((row = mysql_fetch_row(result)))      
 {        
    stringGroups[i] = wxString(row[0], wxConvUTF8);
    i++;
 }
 mysql_free_result(result);
 i = 0;
 strcpy (holdString,"IN (\'");
 while (i < numRows)
 {
   if (i != 0) strcat(holdString, "\', \'");
   strcat(holdString, (const char *)stringGroups[i].mb_str().data());
   i++;  
 }   
 strcat (holdString," \')");

-- END OF CODE --

--ACTUAL stringGroup that fails -- Debugger Watch Output
stringGroups[2] {m_impl=L"文字化け"... 

Я ожидаю получить:

IN ( 'test' , 'test' , '文字化け' )

что я получу

IN ( 'test','test2','' )

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

Не используйте strcpy() и strcat() с wxString, это просто излишне подвержено ошибкам. Если вы сначала используете wxString, соберите всю нужную вам строку, а затем метод utf8_str(), чтобы получить буфер, содержащий содержимое строки UTF-8, который затем можно передать любой функции, которая вам нужна.

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

auto const& buf = some_wx_string.utf8_str();
... now you can use buf.data() safely until the end of scope ...
1 голос
/ 08 апреля 2019

wxString::mb_str() преобразуется в многобайтовую строку в вашей текущей локали.Предположительно символы в вашей строке не могут быть представлены в вашей локали, поэтому преобразование завершается неудачно и возвращается пустая строка.

Вы должны передать wxConvUTF8 в качестве параметра или просто вызвать utf8_str или ToUTF8.

1 голос
/ 08 апреля 2019

Чтобы получить UTF8 от wxString, вам нужно позвонить ToUTF8().Точно так же для получения UTF8 в wxString есть FromUTF8().Оба являются членами wxString и задокументированы.

...