iOS計算字符串的對應字節數
本文展示在iOS下,如何正確的計算輸入的字符個數。
常見編碼
漢字、中文符號
UTF-8編碼下,一個漢字,包括中文符號標點,占3個字節。
GBK、GB2312編碼下,是2個字節。
emoji表情
無論是UTF-8,還是GBK、GB2312,emoji表情都是占用4個字節。
iOS的設備編碼
iOS的設備,基本上都是使用UTF-8編碼,所以一個漢字是3個字節。
現狀
通常情況下,數據庫的存儲,會使用UTF-8編碼。
而我們在編程時,會把一個漢字認為是2個字節。
結論
因此,我們需要使用GBK的編碼,去判斷用戶輸入的字符個數,以作限制。
1、獲取GBK編碼
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
2、使用GBK編碼作為 cStringUsingEncoding
方法的編譯,來獲取字符串的cString首個字符指針。
3、使用 lengthOfBytesUsingEncoding
獲取字節長度,然后遍歷,由此計算出所有字符長度。
代碼示例
將以下代碼放入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;
}