我正在尝试将字符串数组连接为字符数组-但是其中一个字符串是外语(为什么我需要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','' )
答案 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_str
或ToUTF8
。