今天碰到一个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);
}