#c #visual-studio #mariadb #wxwidgets
#c #visual-studio #mariadb #wxwidgets
Вопрос:
Я пытаюсь объединить массив строк в массив символов, но одна из строк на иностранном языке (зачем мне нужен UTF8). Я вижу строку UTF8 на соответствующем языке в отладчике (Visual Studio) после того, как я прочитал ее из базы данных и поместил в массив wxString, но когда я пытаюсь объединить строку с массивом, t никогда не помещается туда.
Я пробовал variable.mb_str() variable.mb.str().data() . Похоже, ни один из них не работает в 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','' )
Ответ №1:
Не используйте strcpy()
и strcat()
с wxString
, это просто без необходимости подвержено ошибкам. Если вы используете wxString
в первую очередь, создайте всю нужную вам строку, а затем utf8_str()
метод, чтобы получить буфер, содержащий содержимое строки UTF-8, которое затем можно передать любой функции, которая вам нужна.
Имейте в виду, что этот буфер является временным, поэтому вы не можете полагаться на то, что он продолжает существовать, если вы не создадите его копию или, по крайней мере, не продлите его срок службы, т. Е.
auto constamp; buf = some_wx_string.utf8_str();
... now you can use buf.data() safely until the end of scope ...
Ответ №2:
Чтобы получить UTF8 от wxString
вас, нужно позвонить ToUTF8()
. Аналогично, для получения UTF8 wxString
существует FromUTF8()
. Оба являются членами wxString
и документированы.
Ответ №3:
wxString::mb_str()
преобразуется в многобайтовую строку в вашем текущем языковом стандарте. Предположительно, символы в вашей строке не представимы в вашем языковом стандарте, поэтому преобразование завершается ошибкой и возвращается пустая строка.
Вы должны передать wxConvUTF8
в качестве параметра или просто вызвать utf8_str
или ToUTF8
вместо этого.