一个关于汉字内码的问题 我要写一个程序把一个纯文本的文件分为若干个纯文本的文件,但是发现分割后的文件中,会有部分文件出现乱码,经分析是因为把一个汉字的二个字节分在了不同的二个文件中所致,请问如何判断某个字节是汉字的高字节还是低字节,还是就是全角字符的内码是怎么样编码的?高分相送 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用我的函数处理吧,可以返回字符串中字母和中文存储在字符串数组arrStr中。Str为你需要处理的字符串int treateStr(CString Str,CStringArray &arrStr){ int i=0,strLen; CString str1,str2,OneChn; BYTE* SourceSTR; SourceSTR =(BYTE* )(LPCTSTR)Str; strLen = Str.GetLength(); if (strLen == 0) return RTERROR; while(i<strLen) { if(SourceSTR[i]<0xA1||(SourceSTR[i+1]<0xA1)) // English 是英文字符 { str1 = Str.GetAt(i); arrStr.Add(str1); i++; } else if(SourceSTR[i]>0xA1&&SourceSTR[i]<0xB0) //是GB2312的汉字码 { str1 = Str.GetAt(i); str2 = Str.GetAt(i+1); OneChn = str1 + str2; arrStr.Add(OneChn); i+=2; } else if(SourceSTR[i]>0xFE&&SourceSTR[i]<0xA0)//是BIG5的汉字码 第一字节的值在 //16 进制的 A0~FE 之间,第二字节在 40~7E 和 A1~FE 之间 { str1 = Str.GetAt(i); str2 = Str.GetAt(i+1); OneChn = str1 + str2; arrStr.Add(OneChn); i+=2; } else if(SourceSTR[i]>0x81&&SourceSTR[i]<0xFE)// GBK 第一字节的值在 16 进制的 //81~FE 之间,第二字节在 40~FE { str1 = Str.GetAt(i); str2 = Str.GetAt(i+1); OneChn = str1 + str2; arrStr.Add(OneChn); i+=2; } else // 其他 { str1 = Str.GetAt(i); str2 = Str.GetAt(i+1); OneChn = str1 + str2; arrStr.Add(OneChn); i+=2; } } return 1;} 这个函数只能判断一个字符能不能是头字符,两字节内码:GBK范围:1st byte 2nd byte0x81~0xfe 0x40~0x7e and 0x80~0xfeBIG5范围:1st byte 2nd byte0x81~0xfe 0x40~0x7e and 0xa1~0xfe第一字符和第二字符有重复的部分,所以这个函数无法区分第一字符和第二字符.唯一查找的方法是,从一个你确定不是汉字的字符(小于0X40)开始查起 很简单根本不需要判断到底是高字节还是低字节!假设你的分割位置为pos;1 得到pos位置的value: charValue,----char型2 if(charValue>256)//is a 汉字3 判断pos前后两个字节的值,如果前一个字节>256,说明pos是汉字的低字节,否则是汉字的高字节!反正汉字用两个字节表示,并且每个字节的最高为使1,怎么做你应该明白 vc如何执行sql脚本操作oracle数据库 调试的时候提示的错误,怎么解决? unsigned char * 类型存取Access数据库的问题 VC里面glm出错 ATL中IE添加button响应问题!!!! 如何做像示波器一样的界面? 通过com进行web验证 函数之间怎么传递数组?能举个例子吗? VC下如何操作dbase数据库,odbc,dao,ado? 关于模拟 Spy++ 的消息跟踪功能 SOS!SOS!SOS!菜的不能再菜的问题,各位大侠救命!(^o^) 使用真彩色图标
存储在字符串数组arrStr中。Str为你需要处理的字符串int treateStr(CString Str,CStringArray &arrStr)
{
int i=0,strLen;
CString str1,str2,OneChn;
BYTE* SourceSTR;
SourceSTR =(BYTE* )(LPCTSTR)Str;
strLen = Str.GetLength();
if (strLen == 0)
return RTERROR;
while(i<strLen)
{
if(SourceSTR[i]<0xA1||(SourceSTR[i+1]<0xA1)) // English 是英文字符
{
str1 = Str.GetAt(i);
arrStr.Add(str1);
i++;
}
else if(SourceSTR[i]>0xA1&&SourceSTR[i]<0xB0) //是GB2312的汉字码
{
str1 = Str.GetAt(i);
str2 = Str.GetAt(i+1);
OneChn = str1 + str2;
arrStr.Add(OneChn);
i+=2;
}
else if(SourceSTR[i]>0xFE&&SourceSTR[i]<0xA0)//是BIG5的汉字码 第一字节的值在
//16 进制的 A0~FE 之间,第二字节在 40~7E 和 A1~FE 之间
{
str1 = Str.GetAt(i);
str2 = Str.GetAt(i+1);
OneChn = str1 + str2;
arrStr.Add(OneChn);
i+=2;
}
else if(SourceSTR[i]>0x81&&SourceSTR[i]<0xFE)// GBK 第一字节的值在 16 进制的
//81~FE 之间,第二字节在 40~FE
{
str1 = Str.GetAt(i);
str2 = Str.GetAt(i+1);
OneChn = str1 + str2;
arrStr.Add(OneChn);
i+=2;
}
else // 其他
{
str1 = Str.GetAt(i);
str2 = Str.GetAt(i+1);
OneChn = str1 + str2;
arrStr.Add(OneChn);
i+=2;
}
}
return 1;
}
两字节内码:
GBK范围:
1st byte 2nd byte
0x81~0xfe 0x40~0x7e and 0x80~0xfeBIG5范围:
1st byte 2nd byte
0x81~0xfe 0x40~0x7e and 0xa1~0xfe第一字符和第二字符有重复的部分,所以这个函数无法区分第一字符和第二字符.
唯一查找的方法是,从一个你确定不是汉字的字符(小于0X40)开始查起
根本不需要判断到底是高字节还是低字节!
假设你的分割位置为pos;
1 得到pos位置的value: charValue,----char型
2 if(charValue>256)//is a 汉字
3 判断pos前后两个字节的值,如果前一个字节>256,说明pos是汉字的低字节,否则是汉字的高字节!
反正汉字用两个字节表示,并且每个字节的最高为使1,怎么做你应该明白