如何将Unicode字符串连接成字符串以传递到mysql调用

时间:2019-04-08 18:25:10

标签: c++ visual-studio mariadb wxwidgets

我正在尝试将字符串数组连接为字符数组-但是其中一个字符串是外语(为什么我需要UTF8)。从数据库中读取UTF8字符串并将其放入wxString数组后,我可以在调试器(Visual Studio)中以适当的语言看到UTF8字符串,但是当我尝试将字符串连接到该数组时,永远不会被放到那里

我尝试过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','' )

3 个答案:

答案 0 :(得分:2)

不要将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 :(得分:1)

要从wxString获取UTF8,您需要致电ToUTF8()。同样,为了使UTF8进入wxString,有FromUTF8()。两者都是wxString的成员并已记录。

答案 2 :(得分:1)

wxString::mb_str()在您当前的语言环境中转换为多字节字符串。推测字符串中的字符在您的语言环境中无法表示,因此转换失败并返回空字符串。

您应该传递wxConvUTF8作为参数,或者直接调用utf8_strToUTF8