我最近碰到一个难题:
    用strlen()来计算含有中文的字符串,会把一个中文字符算作两个;
    有个wcslen()函数,不知可不可以,目前我还不会用!
请高手们指教!!!

解决方案 »

  1.   

    void main()
    {
     printf("wcslen(L\"Hello 中国!\")=%d\n",wcslen(L"Hello 中国!"));
    }//输出:wcslen(L"Hello 中国!")=9
    //注意:语句中的“L”非常必要
      

  2.   

    自己写一个,如下:
    int StrLen( const char *str )
    {
      int iLen = 0;
      while( *(str+iLen) )
      {
       if( *(str+iLen) < 0 )   iLen += 2; //汉字
       iLen++;
      }
     return iLen;
    }
    //这仅仅是一个简单的例子,具体可以更优化一些,但也应该考虑得更多一些。
      

  3.   

    GBK范围:
    1st byte    2nd byte
    0x81~0xfe   0x40~0x7e and 0x80~0xfeBIG5范围:
    1st byte    2nd byte
    0x81~0xfe   0x40~0x7e and 0xa1~0xfe
      

  4.   

    wcslen()我也没有用过,好像是宽字节串处理函数。
    如果不行就自己写一个吧,算法比较简单的。GetHZStringLen(const char* pStr)
    {
        BOOL bHZ = FLASE;
        UINT  nLen = 0;
        UINT i = 0;
        while(pStr[i] != 0){
           if(pStr[i] >= 127){
               if(bHZ){
                  nLen ++;
                  bHZ = FALSE;
               }
               else{
                  bHZ = TRUE;
                  continue;
                }
           }
           else{
                nLen ++; 
           }    } 
        return nLen;
    }
      

  5.   

    //补充一下
    GetHZStringLen(const char* pStr)
    {
        BOOL bHZ = FLASE;
        UINT  nLen = 0;
        UINT i = 0;
        while(pStr[i++] != 0){
           if(pStr[i] >= 127){
               if(bHZ){
                  nLen ++;
                  bHZ = FALSE;
               }
               else{
                  bHZ = TRUE;
                  continue;
                }
           }
           else{
                nLen ++; 
           }    } 
        return nLen;
    }
      

  6.   

    如何使用wcslen()???
    如:
       char strbuf[256];
       strcpy(strbuf,"中国007");
       wcslen(strbuf);//这句有问题编译时通不过,那该怎样使用??
      

  7.   

    sans(sans)
    请教:我测试了一下你的小程序:
    int StrLen( const char *str )
    {
      int iLen = 0;
      while( *(str+iLen) )
      {
       if( *(str+iLen) < 0 )   iLen += 2; //汉字
       iLen++;
      }#include <windows.h>
    #include <stdio.h>
    #include <iostream.h>
    void main()
    {
    char str[]="三带你三点带点dsfsdahfsh";
    int iLen = 0;
    while( *(str+iLen) )
    {
    if( *(str+iLen) < 0 )
    {
    printf("%d\n",*(str+iLen));
    iLen += 2;//汉字
    }
        iLen++;
    }
    printf("%d\n",*(str+iLen));
    printf("%d\n",iLen);
    } return iLen;
    }
    输出如下:
    -56
    -8
    -56
    -29
    -75
    0
    24
    结果是对的
    但我对其中中间输出的负数不清楚它的真正含义
    望解释
      

  8.   

    wcslen() 應該是只能處理常量的。也就是對變量就會比較麻煩。還是自己寫一個比較好。依次判斷每一個字節,如果是負值,即最高位為1,剛長度值減一下。
      

  9.   

    相关问题,swprintf()如何用?
             char strbuf[256];
    wchar_t  str[256];
    strcpy(strbuf,"中国007");
    swprintf(str,"%s",strbuf);//此句有错误
      

  10.   

    To: unionsoft(gm) wchar_t  str[256];
    wcscpy(str,L"中国007");//重申“L”很重要
      
     
      

  11.   

    To: unionsoft(gm) wchar_t  str[256];
    wcscpy(str,L"中国007");//重申“L”很重要
             int d = wcslen(str);这样就对了swprintf(str,"%s",strbuf);//像这样把char和wchar_t混用当然有错。char和wchar_t是不同的类型,分别对应各自的操作函数,不要用混了。
      

  12.   

    #include <atlbase.h>
    #define _UNICODE   USES_CONVERSION;//must
    char *buf=NULL;
    wchar_t *pwbuf=NULL; buf=(LPSTR)(LPCTSTR)sFieldName;
    pwbuf=A2W(buf);
    hr=pContentHandler->startElement(L"",0,pwbuf,wcslen(pwbuf),pwbuf,wcslen(pwbuf),NULL);
      

  13.   

    忘了加这句
    CString sFieldName="你是中国人吗?Shit";
      

  14.   

    wcscpy(str,L"中国007");
    "L'是很重要,但要是该函数的两个参数都是变量,那么这个“L"怎么加?
    如:
          wcscpy(str0,str1);
    //其中str1是从文件中读取的字符串请指教。
      

  15.   


    #include <atlbase.h>char *b="Hello,中国人";
    wchar_t *a=new wchar_t[strlen(b)*2+1];
    wcscpy(a, A2BSTR(b));
    int i=wcslen(a);
    delete []a;
      

  16.   

    忘了你只是要求长度了,上面的代码演示了赋值完全是多余的。#include <atlbase.h>char *b="Hello,中国人";
    int i=wcslen(A2BSTR(b));
      

  17.   

    (1)
             CString str="中国1";
    int i=_mbslen((const unsigned char *)(LPCTSTR(str)));
             (2)
             char *str="中国1";
    int i=_mbslen((const unsigned char *)(str));
      

  18.   

    为什么都不用多字节字符处理函数,VC中有完整的这一类函数,以_mbs开头。
      

  19.   

    To: wzyy(维西) 
    你的方法确实蛮好,那我有点不清楚了,_mbs打头的一系列函数与wcscpy等一系列函数有说明不同。