为了使我的软体界面支持多国语,我把自己工程设置成了UNICODE,另外XML文件中保存了各种语系下的字符串,当程序检测到操作系统是哪个国家的时候,自动的从XML中读出相应国家的字符串来修改界面中的字符串,我遇到一个问题是读出来的字符串如果是特殊字符的话就是乱码,请高手赐教啊!!!!
我用这个函数来读的,我把最后返回的类对象打印出来看,如果有特殊字符的字串始终是乱码
CString openfile(CString file)
{

CString context; TCHAR ch;
FILE *of;
of=_wfopen(file,TEXT("r"));
ch=fgetwc(of);
while(ch!=EOF)
{
context+=ch;
ch=fgetwc(of);
}
return context;
}

解决方案 »

  1.   

    Środkowy这个S就是一个特殊的字符,在中文系统下显示的是乱码
      

  2.   

    打开的是XML的文件.Ś读出来是乱码
      

  3.   

    如果谁要DEMO代码的话加我QQ,麻烦帮我看一看
      

  4.   

    我怎么感觉define 了UNICODE只是让TCHAR变成了宽字符WCHAR,编码转换到UTF8似乎还要靠自己
      

  5.   

    我将得出来的字符串用这个函数转换LPTSTR  ConvertGBKToUtf8(LPTSTR strGBK)
    {
    // MessageBox(NULL,strGBK,strGBK,MB_OK);
    int len=MultiByteToWideChar(CP_ACP, 0, (const char *)strGBK, -1, NULL,0);
    unsigned short * wszUtf8 = new unsigned short[len+1];
    memset(wszUtf8, 0, len * 2 + 2);
    MultiByteToWideChar(CP_ACP, 0, (const char *)strGBK, -1, wszUtf8, len);
    // MessageBox(NULL,wszUtf8,wszUtf8,MB_OK); len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
    LPTSTR szUtf8=new TCHAR[len + 1];
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1,  (char*)szUtf8, len, NULL,NULL);

    strGBK = (LPTSTR)szUtf8;
    MessageBox(NULL,strGBK,strGBK,MB_OK);
    // AfxMessageBox(strGBK);
    delete[] szUtf8;
    delete[] wszUtf8;
    return strGBK;
    }很不幸得到的还是乱码
      

  6.   

    我把从XML中读出的数据先转化成字符串
    CString context=openfile(FILENAME);
    LPTSTR lpsz = new TCHAR[context.GetLength()+1]; 
    _tcscpy(lpsz, context);      
    ConvertGBKToUtf8(lpsz);
    XML中的数据是
    <?xml version="1.0" encoding="UTF-8"?>
    <xml_polish>
    <Language>Język</Language>
    </xml_polish>
    这样转化了之后呢读出来的ę始终是乱码,请各位大侠指点
      

  7.   


    CString openfile(CString file) 

    setlocale(LC_ALL , "");CString context; TCHAR ch; 
    FILE *of; 
    of=_wfopen(file,TEXT("r")); 
    ch=fgetwc(of); 
    while(ch!=EOF) 

    context+=ch; 
    ch=fgetwc(of); 

    return context; 
    }
      

  8.   

    http://msdn.microsoft.com/en-us/library/x99tb11d.aspx
    有关setlocale的说明。
      

  9.   

    楼主,你的XML文件存储的格式是UTF8么?如果是的话,你应该是把UTF8的格式转化为Unicode
    CP_ACP指的是local code page
      

  10.   

    的确是如楼上胸台所言,但是我在网上搜索了一下UTF8的格式转化为Unicode size_t g_f_u8towc(wchar_t &dest_wchar, const unsigned char * src_str)   {   

    int count_bytes = 0;   

    unsigned char byte_one = 0, byte_other = 0x3f; // 用于位与运算以提取位值 0x3f-->00111111   

    wchar_t tmp_wchar = L'0';   



    if (!src_str)   

    return (size_t)-1;   



    for (;;) // 检测字节序列长度,根据第一个字节头的1个个数   

    {   

    if (src_str[0] <= 0x7f){   

    count_bytes = 1; // ASCII字符: 0xxxxxxx( ~ 01111111)   

    byte_one = 0x7f; // 用于位与运算, 提取有效位值, 下同 01111111   

    break;   

    }   

    if ( (src_str[0] >= 0xc0) && (src_str[0] <= 0xdf) ){   

    count_bytes = 2; // 110xxxxx(110 00000 ~ 110 111111)   

    byte_one = 0x1f; //00011111 第一字节有效位的个数   

    break;   

    }   

    if ( (src_str[0] >= 0xe0) && (src_str[0] <= 0xef) ){   

    count_bytes = 3; // 1110xxxx(1110 0000 ~ 1110 1111)   

    byte_one = 0xf; //00001111   

    break;   

    }   

    if ( (src_str[0] >= 0xf0) && (src_str[0] <= 0xf7) ){   

    count_bytes = 4; // 11110xxx(11110 000 ~ 11110 111)   

    byte_one = 0x7;   

    break;   

    }   

    if ( (src_str[0] >= 0xf8) && (src_str[0] <= 0xfb) ){   

    count_bytes = 5; // 111110xx(111110 00 ~ 111110 11)   

    byte_one = 0x3;   

    break;   

    }   

    if ( (src_str[0] >= 0xfc) && (src_str[0] <= 0xfd) ){   

    count_bytes = 6; // 1111110x(1111110 0 ~ 1111110 1)   

    byte_one = 0x1;   

    break;   

    }   

    return (size_t)-1; // 以上皆不满足则为非法序列   

    }   

    // 以下几行析取UTF-8编码字符各个字节的有效位值   

    //先得到第一个字节的有效位数据   

    tmp_wchar = src_str[0] & byte_one;   

    for (int i=1; i 

    {   

    tmp_wchar <<= 6; // 左移6位后与后续字节的有效位值"位或"赋值   

    tmp_wchar = tmp_wchar | (src_str[i] & byte_other);//先与后或   

    }   

    // 位值析取__End!   

    dest_wchar = tmp_wchar;   

    return count_bytes;   

    }   
    for循环那里就没有了,你们有完整的代码吗?
      

  11.   

    这个问题终于解决了,又遇到一个新的问题就是,我用messagebox打印出来的字符串是正确的,但是在工程里面的控件中显示还是乱码,不知道怎么解决?
      

  12.   

    XML文件的话,为什么不用XML的组件呢?比如MSXML,一般都能正确处理编码问题。