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

时间:2015-03-13 19:23:58

标签: 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;
        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。 其实我不知道该怎么做......脑子停了......

请帮忙。感谢。

1 个答案:

答案 0 :(得分:1)

如果为UNICODE编译MFC,CString将被定义为使用UTF16 encodingwchar_t字符串。

直接从CString构建char*,只有当所有字符都在UNICODE的ASCII子集中时才有效:

  • 一旦unicode char不是ASCII,它将以UTF8编码为几个字节,但CString构造函数然后将其解释为两个不同的字符。
  • 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");