CString str1 = "xxxxxxxxxxxxxxxxxx";
int n = str1.GetLength();
CString str2 = str1.Left(i);
其中,str是一个包含字母和汉字的字符串,i是1到n之间的随机数。请问大家,如何判断str2最后一个字节是字母还是汉字?如果是汉字,它是双字节的哪一个字节?

解决方案 »

  1.   

    如果有包含汉字,建议使用UNICODE的方式,以双字节方式存储。否则,汉字的高低位判断只能用从“头”(第一个起始汉字)开始计数,或用概率(将汉字分成常用和生僻两组,如果出现生僻字的内码,则认需要偏移一个字节才是汉字的开始)的方式猜想。后者常用于乱码纠错。
      

  2.   

    to zhishao(zhi):
    “汉字的高低位判断只能用从“头”(第一个起始汉字)开始计数”是什么意思?如果字符串中包含多个汉字,无法判断任意一个汉字的高低位吗?麻烦解释一下!
      

  3.   

    to zhishao(zhi):
    “汉字的高低位判断只能用从“头”(第一个起始汉字)开始计数”是什么意思?如果字符串包含多个汉字,能否判断任意一个汉字的高低位?麻烦解释一下!
      

  4.   

    最后一个应该是字母吧
    对任一个刚可以用if(str.GetAt(n)&0x80)是汉字,else是字母
      

  5.   

    protected:
    //{{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnButtonExit();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
      

  6.   

    to lizmei001(暗黑):
    可以判断是不是汉字,但如何判断是汉字的高或低字节呢?
      

  7.   

    你可以去判断一个位的前一个字节
    if(str.GetAr(n-1)&0x80)则是汉字
      

  8.   

    我想你需要的是这样的功能吧!我把我以前写的一段代码给你参考。void SplitString( const char *szString,int nMaxSize,CStringArray &saSplitString )
    {
    int nAscii = 0;
    CString str = szString;
    for( int i = 0;i < str.GetLength();i ++ ) {
    if( (BYTE)str[i] < 0x7f ) nAscii ++;
    if( (nAscii % 2 == 0 && i + nAscii * 2 >= nMaxSize) ) {
    saSplitString.Add( str.Left( i ) );
    str = str.Mid( i );
    i = -1;
    nAscii = 0;
    continue;
    }
    else if( i + nAscii * 2 >= nMaxSize && i % 2 > 0 ) {
    saSplitString.Add( str.Left( i ) );
    str = str.Mid( i );
    i = -1;
    nAscii = 0;
    continue;
    }
    }
    if( !str.IsEmpty() ) saSplitString.Add( str );
    }该函数把一个较长的包含字母、数字和汉字的字串中按照一定的长度分成多个子串,保证每个字串不会把一个汉字给分成两半。
      

  9.   

    如果有包含汉字,建议使用UNICODE的方式,以双字节方式存储。根据最后一个字节的前一字节if(str.GetAt(n-1)&0x80)是汉字else是字母,最后一个字节是汉字的低字节。
      

  10.   

    如果有包含汉字,建议使用UNICODE的方式,以双字节方式存储。根据最后一个字节的前一个字节if(str.GetAr(n-1)&0x80)则是汉字,
    最后一个字节是汉字的低字节
      

  11.   

    比如这样的一个字符串:U C S 的 方 式
    0 1 2 34 56 78很容易判断str.GetAt(5) > 0x7e,是汉字。但是,是高位还是地位呢?就需要从“的”字的索引“3”开始“1-2”计数,即:3-4-5 
    1-2-1 很明显,str.GetAt(5)返回的是汉字的高位字节。
      

  12.   

    英文字符以及一些半角符号是单字节的,小于128,汉字及全角字符是双字节的,
    一般来讲,在国标码里,首字节的asc值161-163是标点,一般符号,序号,数字,
    拉丁字母,164-165是日文假名,166是希腊字母,167是俄文字母,168是汉语拼音
    字母和注音字母,176-254是汉字。
    一般我做的时候,是用unsigned char读取一个字节,判断是否大于128,然后在读取下一个字节。你的问题“判断当前所指是汉字的高位字节还是低位字节”理论上
    不可能,因为一个汉字的高低位互换就可能是另一个汉字,不可能拿到一个大于176的字符就判断是汉字的高位还是低位。除非你拿到i后到str1里往前或者往后找asc码来判断,好像比较麻烦。:)
      

  13.   

    to zhidao(zhi):
    多谢详细讲解,小弟我已经开窍了:)to all:
    还有一个问题,用IsDBCSLeadByte函数是不是无法判断双字节汉字的高低位?
      

  14.   

    IsDBCSLeadByte()只分辨ASCII但字节字符集和双字节字符集的差别,并不能用来判断高低位,对于中文的高低字节它都会返回 TRUE 。