勘误: iOS判断中文字

今天碰到一个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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,237评论 25 708
  • 1.编译程序(1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a.o...
    萌面大叔2阅读 1,321评论 0 1
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,363评论 0 6
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,422评论 0 35
  • 一言不合就开车。 所以这团quark-gluon plasma比一个原子还小,膨胀后塑成了整个宇宙?根据能量守恒定...
    Trapa读书随想录阅读 255评论 0 0