今天碰到一個bug, 最終定位到的問題是同事用了網(wǎng)上流傳的某段代碼, 導(dǎo)致判斷錯誤引起.
在許多人的博客上(http://blog.csdn.net/a416863220/article/details/41893339, http://www.lxweimin.com/p/9bf1a6d9e967), 使用了這么一些代碼來計(jì)算字符串長度或者判斷一個字符是不是中文:
//判斷一個字符是不是中文。
-(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;
}
平時用著沒有什么問題, 但是當(dāng)輸入的string是中文字"一"時, isChinese
返回是false, convertToInt
返回是1.
斷點(diǎn), 發(fā)現(xiàn)當(dāng)輸入是"一"時, 指針p對應(yīng)的*p在Xcode中是"".
輸入為"二", 對應(yīng)的是"\x8cN". 然而實(shí)際上"二"對應(yīng)的Unicode編碼是"\u4e8c".
猜測是iOS的NSUnicodeStringEncoding
在編碼"一"時用char型指針解到的內(nèi)容是0000
.
如果有了解具體情況的同學(xué), 麻煩告知一下, 多謝.
PS: 附上正確的判斷代碼,摘自網(wǎng)絡(luò), 出處未知
- (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);
}