为了使我的软体界面支持多国语,我把自己工程设置成了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;
}
我用这个函数来读的,我把最后返回的类对象打印出来看,如果有特殊字符的字串始终是乱码
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;
}
解决方案 »
- 问问,纯windows SDK编程在那个版面啊?
- 我如何把COM组件里的字符串变量传递给该COM组件里的ChtmlView类所指示的URL文件里的IFRAME。
- 500分: 谁能解决者立刻给分,本贴不算,up 有分
- 有没有配置IE的安全属性的函数?
- 高分求助,数据库表中添加记录时得奇怪问题
- COM设计中一些零碎的问题,你是怎么解决的?
- 学文科的搞编程的人多吗
- MFC学生信息管理系统代码求解!!!
- 新手求一个基于MFC TCP/IP的简单网络界面程序 要源代码
- 大家,这些进程在windows里都充当什么角色?
- 请问如何在程序中动态的改变List Control的(styles)风格,比如说选中Edit labels,或者取消Edit labels
- 写文件时少写了一部分?
{
// 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;
}很不幸得到的还是乱码
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>
这样转化了之后呢读出来的ę始终是乱码,请各位大侠指点
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;
}
有关setlocale的说明。
CP_ACP指的是local code page
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循环那里就没有了,你们有完整的代码吗?