Unicode字符成为问号(基于C++和MFC对话框的应用程序)
这些代码将值设置为editbox。但当我从MySQL表中检索Unicode字符时遇到了问题 例如,字符串nüşabə设置为nüŸabÉ™. 这是我的密码Unicode字符成为问号(基于C++和MFC对话框的应用程序),c++,mysql,unicode,mfc,C++,Mysql,Unicode,Mfc,这些代码将值设置为editbox。但当我从MySQL表中检索Unicode字符时遇到了问题 例如,字符串nüşabə设置为nüŸabÉ™. 这是我的密码 void CmysqlDlg::OnBnClickedButton3() { USES_CONVERSION; try { mysql::MySQL_Driver *driver = new mysql::MySQL_Driver; Connection *dbConn;
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\u general\u ci。
其实我不知道我该怎么做。。。大脑停止了
请帮忙。谢谢。如果您为UNICODE编译MFC,将被定义为使用的wchar\t字符串 与您一样,仅当所有字符都在UNICODE的ASCII子集中时,才可以直接从字符*构造CString: 一旦unicode字符不是ASCII,它将在UTF8中编码为几个字节,但CString构造函数随后将其解释为两个不同的字符。 这是nüşabəwithü、ş和ə的情况,它们都需要UTF8中的2个字节,并导致CString比预期的长3个字符。 因此,当您在char*中有一个UTF8编码的字符串时,您需要使用MultiByteToWideChar进行转换,如中所述 编辑:代码示例 而不是
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;
请注意,及其反向WideChartMultiByte属于Windows API而不是MFC
< P>注意,标准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");
“我希望你知道你是,”克里斯,谢谢你的快速回复。但我不明白你的意思。您能解释一下吗?将异常捕获为Catch exception const&e。@RichardCritten我试过了。但也不例外。程序不停止工作。@coni,这只是代码的一个问题。您捕获异常的方法不会尊重任何派生异常类所做的重写。谢谢您的回答。它看起来非常有用,但实际上我不知道如何编写此代码:@coni我已经用一些代码编辑过,以演示如何执行此操作。哦,亲爱的,非常感谢。它解决了我的问题。哦,我的上帝!再三感谢!