解决MFC的CString类型数据存储到Mysql的冷僻汉字乱码

“䶮”字,存入mysql后,是?号。跟踪后发现,在调用mysql_real_query函数之前,CString转为char*的时候就已经是?号了。怎么办?

网上找了一圈,没解决。于是自己就想个笨方法:

(存库的时候)1.先将“䶮”字转为16进制的unicode编码 2.将unicode编码转字符串存入mysql 

(读库的时候)1.先将char*转16进制的unicode编码 2.将16进制的转汉字

代码如下:

引入头文件:

#include "string"
#include <inttypes.h>

     存: 

   //将姓名转为unicode码存入数据库,避免有些冷僻字无法存储
    CString unicode;
    UINT16 n;
    for (size_t i = 0; i < name.GetLength(); i++)//假设name里面存入的是“李䶮䶮”
    {
        n = name.GetAt(i);
        unicode.Format(_T("%s0x%0x"), unicode, n);
    }

取:

while (row = mysql_fetch_row(mysql_res))
    {
        for (size_t i = 0; i < col; i++)
        {
            CString value(row[i]); 
            //如果是姓名列,那么就由16进制Unicode码转回汉字
            if (是名字这一列)
            {
                CString name;
                for (size_t j = 0; j < strlen(row[i]); j += 6)
                {
                    char code[7];
                    memcpy_s(code, 7, &row[i][j], 6);  //截取一个汉字的unicode
                    code[6] = '\0';
                    uint16_t ucode;
                    sscanf_s(code, "%" SCNx16, &ucode);//由字符串形式的unicode转为16进制
                    name.Format(_T("%s%c"), name, ucode);//将16进制unicode码转为汉字
                } 
            }
            else
            {
                //不是名字这一列,在此处理
            }
        }

    }

/****************************************************************************

这个方法虽然low,但是也算解决了我的问题,目前能凑合着用。期待各位大神万忙之中给个完美的解决方案,不胜感激。

******************************************************************************/

猜你喜欢

转载自blog.csdn.net/miaowansheng/article/details/98209558