Unicode字符成为问号(基于C++和MFC对话框的应用程序)

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;

这些代码将值设置为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\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我已经用一些代码编辑过,以演示如何执行此操作。哦,亲爱的,非常感谢。它解决了我的问题。哦,我的上帝!再三感谢!