工程项目是unicode字符集,WritePrivateProfileString(_T("main"), _T("carnum"), _T("豫一二三"), g_prSetupInfo.m_strPlateInfo);的时候中文能写入文件,而WritePrivateProfileString(_T("main"), _T("carnum"), _T("豫"), g_prSetupInfo.m_strPlateInfo);时中文显示就是乱码。请问是什么原因啊,在线等。

解决方案 »

  1.   

    这,转个CString或者wchar_t尝试下看看呢?
      

  2.   

    研究了下,WritePrivateProfileStringW实际写的是ANSI编码,记事本解读时会当作UTF-8来读,具体原因与在记事本中写“联通”保存为ANSI格式,再打开的效果一样,参考:
    ansi,gb2312,gbk,gb18030,unicode,utf-8,unicode big endian编码的区别
    最后几段提到的“联通”现象。
      

  3.   

    谢谢BeanJoy,可是该如何往里面写入汉字啊?
      

  4.   

    虽然写进去,记事本打开是乱码,但是读取的时候是正常的。
    然后我又试试了这样行CFile file(_T("E:\\liutest\\d10\\test.ini"), CFile::modeRead | CFile::modeWrite | CFile::modeCreate);
    file.SeekToBegin();
    WCHAR s = 0xFEFF;
    file.Write(&s, 1);
    file.Close();
    WritePrivateProfileString(_T("main"), _T("carnum"), _T("豫"), _T("E:\\liutest\\d10\\test.ini"));
    不过多了一个开始换行。
      

  5.   

    你可以试下把配置转成UTF-8再保存。
      

  6.   


    CString str = _T("豫");
    int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, str, wcslen(str), NULL, 0, NULL, NULL);
        char* szU8 = new char[u8Len + 1];
        ::WideCharToMultiByte(CP_UTF8, NULL, str, wcslen(str), szU8, u8Len, NULL, NULL);
        szU8[u8Len] = '\0';
    WritePrivateProfileStringA("main", "carnum", szU8, "d:\\1.ini");将配置项转换成UTF-8,然后调用WritePrivateProfileString的ANSI版本也可以,显示正常。
    你可以写个自己的函数
    MyWritePrivateProfileString
    在此函数中保存转换和保存也是可以的。