iOS开发进阶之路

勘误: iOS判断中文字

2017-02-16  本文已影响144人  小失

今天碰到一个bug, 最终定位到的问题是同事用了网上流传的某段代码, 导致判断错误引起.
在许多人的博客上(http://blog.csdn.net/a416863220/article/details/41893339, http://www.jianshu.com/p/9bf1a6d9e967), 使用了这么一些代码来计算字符串长度或者判断一个字符是不是中文:

//判断一个字符是不是中文。 
-(BOOL)isChinese:(NSString*)str  
{  
    int strlength = 0;  
    char* p = (char*)[str cStringUsingEncoding:NSUnicodeStringEncoding];  
    for (int i=0 ; i<[str lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {  
        if (*p) {  
            p++;  
            strlength++;  
        }  
        else {  
            p++;  
        }  
    }  
    return ((strlength/2)==1)?YES:NO;  
}
- (int)convertToInt:(NSString*)strtemp
{
    int strlength = 0;
    char* p = (char*)[strtemp cStringUsingEncoding:NSUnicodeStringEncoding];
    for (int i=0 ; i<[strtemp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++)
    {
        if (*p)
        {
            p++;
            strlength++;
        }
        else
        {
            p++;
        }

    }
    return strlength;
}

平时用着没有什么问题, 但是当输入的string是中文字"一"时, isChinese返回是false, convertToInt返回是1.
断点, 发现当输入是"一"时, 指针p对应的*p在Xcode中是"".
输入为"二", 对应的是"\x8cN". 然而实际上"二"对应的Unicode编码是"\u4e8c".
猜测是iOS的NSUnicodeStringEncoding在编码"一"时用char型指针解到的内容是0000.
如果有了解具体情况的同学, 麻烦告知一下, 多谢.

PS: 附上正确的判断代码,摘自网络, 出处未知

- (NSInteger)countWordWithStr:(NSString *)s
{
  NSInteger i,n=[s length],l=0,a=0,b=0;
  unichar c;
  for(i=0;i<n;i++){
    c=[s characterAtIndex:i];
    if(isblank(c)){
      b++;
    }else if(isascii(c)){
      a++;
    }else{
      l++;
    }
  }
  if(a==0 && l==0) return 0;
  return l+(NSInteger)ceilf((float)(a+b)/2.0);
}
上一篇 下一篇

猜你喜欢

热点阅读