iOS計算字符串的對應字節(jié)數(shù)
本文展示在iOS下鲫懒,如何正確的計算輸入的字符個數(shù)。
常見編碼
漢字刽辙、中文符號
UTF-8編碼下窥岩,一個漢字,包括中文符號標點宰缤,占3個字節(jié)颂翼。
GBK、GB2312編碼下慨灭,是2個字節(jié)朦乏。
emoji表情
無論是UTF-8,還是GBK氧骤、GB2312呻疹,emoji表情都是占用4個字節(jié)。
iOS的設備編碼
iOS的設備筹陵,基本上都是使用UTF-8編碼刽锤,所以一個漢字是3個字節(jié)。
現(xiàn)狀
通常情況下惶翻,數(shù)據(jù)庫的存儲姑蓝,會使用UTF-8編碼。
而我們在編程時吕粗,會把一個漢字認為是2個字節(jié)纺荧。
結(jié)論
因此,我們需要使用GBK的編碼颅筋,去判斷用戶輸入的字符個數(shù)宙暇,以作限制。
1议泵、獲取GBK編碼
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
2占贫、使用GBK編碼作為 cStringUsingEncoding
方法的編譯,來獲取字符串的cString首個字符指針先口。
3型奥、使用 lengthOfBytesUsingEncoding
獲取字節(jié)長度瞳收,然后遍歷,由此計算出所有字符長度厢汹。
代碼示例
將以下代碼放入NSString的category
- (NSUInteger)charactorNumber
{
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
return [self charactorNumberWithEncoding:encoding];
}
- (NSUInteger)charactorNumberWithEncoding:(NSStringEncoding)encoding
{
NSUInteger strLength = 0;
char *p = (char *)[self cStringUsingEncoding:encoding];
NSUInteger lengthOfBytes = [self lengthOfBytesUsingEncoding:encoding];
for (int i = 0; i < lengthOfBytes; i++) {
if (*p) {
p++;
strLength++;
}
else {
p++;
}
}
return strLength;
}