这些代码将值设置为editbox。但是当我从MySQL表中检索Unicode字符时,我遇到了麻烦。
例如,字符串nüşabə
设置为nüşabÉ™
。
这是我的代码。
void CmysqlDlg::OnBnClickedButton3()
{
USES_CONVERSION;
try
{
mysql::MySQL_Driver *driver = new mysql::MySQL_Driver;
Connection *dbConn;
Statement *st;
ResultSet *res;
driver = mysql::get_mysql_driver_instance();
dbConn = driver->connect("tcp://127.0.0.1:3306", "root", "connection");
dbConn->setSchema("mfc_app_database");
st = dbConn->createStatement();
res = st->executeQuery("SELECT password FROM users WHERE id=1");
string z;
while (res->next())
{
//k = res->getString("username");
//cs.Format(_T("%s"), k);
//CString cs(k.c_str(), CP_UTF8);
//combo.AddString(cs);
//usernameData.SetWindowTextW(cs);
z = res->getString("password");
CString pass(z.c_str()/*, CP_UTF8*/);
nameData.SetWindowTextW(pass);
}
delete res;
delete st;
delete dbConn;
delete driver;
}
catch (exception e)
{
ofstream file("sadaasad.txt");
file << e.what();
file.close();
}
}
数据库归类设置为utf8_general_ci
。
其实我不知道该怎么做......脑子停了......
请帮忙。感谢。
答案 0 :(得分:1)
如果为UNICODE编译MFC,CString将被定义为使用UTF16 encoding的wchar_t
字符串。
直接从CString
构建char*
,只有当所有字符都在UNICODE的ASCII子集中时才有效:
nüşabə
ü
,ş
和ə
就是这种情况,每个都需要UTF8中的2个字节,并使您的CString更长3个字符超出预期。 因此,如果char*
中包含UTF8编码的字符串,则需要使用MultiByteToWideChar()
进行转换,如this SO answer中所述。
编辑:代码示例
而不是
CString pass(z.c_str());
你可以这样写:
wchar_t *p = new wchar_t[z.size()+1]; // UTF16 has same length or less thant UTF8 equivalent
MultiByteToWideChar(
CP_UTF8, // CodePage,
0, // flags,
z.c_str(), // pointer to UTF8 string
-1, // -1 for null terminated string, size otherwise
p, // destination buffer for converted wchar_t string
z.size()+1); // size of buffer
CString pass(p);
delete p;
请注意,MultiByteToWideChar()
及其反向WideCharToMultiByte()
属于Windows API,而不属于MFC。
请注意,标准C ++字符串具有可移植的标准转换函数:
wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> conversion;
wstring s = conversion.from_bytes(z.c_str());
string mbs = conversion.to_bytes(L"\u00c6\u0186");