我要写一个程序把一个纯文本的文件分为若干个纯文本的文件,但是发现分割后的文件中,会有部分文件出现乱码,经分析是因为把一个汉字的二个字节分在了不同的二个文件中所致,请问如何判断某个字节是汉字的高字节还是低字节,还是就是全角字符的内码是怎么样编码的?高分相送

解决方案 »

  1.   

    用我的函数处理吧,可以返回字符串中字母和中文
    存储在字符串数组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;
    }
      

  2.   

    这个函数只能判断一个字符能不能是头字符,
    两字节内码:
    GBK范围:
    1st byte    2nd byte
    0x81~0xfe   0x40~0x7e and 0x80~0xfeBIG5范围:
    1st byte    2nd byte
    0x81~0xfe   0x40~0x7e and 0xa1~0xfe第一字符和第二字符有重复的部分,所以这个函数无法区分第一字符和第二字符.
    唯一查找的方法是,从一个你确定不是汉字的字符(小于0X40)开始查起
      

  3.   

    很简单
    根本不需要判断到底是高字节还是低字节!
    假设你的分割位置为pos;
    1 得到pos位置的value: charValue,----char型
    2 if(charValue>256)//is a 汉字
    3 判断pos前后两个字节的值,如果前一个字节>256,说明pos是汉字的低字节,否则是汉字的高字节!
    反正汉字用两个字节表示,并且每个字节的最高为使1,怎么做你应该明白