iOS如何统计中英文混合的字符串字节数

有时候我们在开发过程中,服务端使用了varchar来保存字符串,这时候如果直接用字符串的.length属性获得字符串长度的话可能会导致字符串在服务端数据库中被截断。比如varchar(256)可以存储128个汉字或者256个英文字母,而你上传的字符串超过了128个汉字的长度。但是我们也不能直接判断字符串的length是否小于等于128,因为当字符串为英文时最多是可以输入256个英文字母的。

因此其实我们想要的是“一个汉字或者两个英文字母计长度为1”,在新浪微博的APP的发布微博界面里就是这样的,那么我们要如何实现这样的效果呢?先上代码~

NSString *text = @”你好Hello World!”;
NSInteger length = [text lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
length -= (length – text.length) / 2;
length = (length +1) / 2;
NSLog(@”%ld”, (long)length);

此处输出结果为8,如果直接使用text.length的话得到的会是14。

这里利用了NSStringlengthOfBytesUsingEncoding:方法,这个方法会根据你传入的参数(也就是字符编码)来计算这个字符串所占用的内存空间。

在UTF8编码中,一个英文字母占用1个字节,一个汉字会占用3个字节,与我们想要的结果有些偏差,但是我们可以通过一些简单的计算来得到我们想要的结果。

啰嗦的解释(方便小白理解)

首先是length -= (length - text.length) / 2;这一行,简单点解释就是@”哈ab”这个字符串的length为3,而通过lengthOfBytesUsingEncoding:方法得到的这个字符串用UTF8编码所占内存为5个字节,减去length之后得到2,此时结果就是这个字符串里的汉字所占内存的大小了~(@”你好abc”经过这道计算后得到4,@”哈哈哈1234″经过计算后得到6)。
这时候用这个结果除以2自然就得到了这个字符串里的汉字个数了,UTF8编码里汉字占3个字节,但是我们想要计算的是一个汉字占2个字节,所以再用整体的UTF8编码所占内存大小减去汉字个数就得到了“一个汉字占2个字节,一个英文字母占1个字节”的结果。

但是我们想要的是“一个汉字或者两个英文字母计长度为1”这样的效果,所以用上边的结果+1再除以二就可以得到最终效果啦。
为什么要+1而不是直接除以二呢?因为当length为偶数时除以二的确是得到了正确的结果,但是当length为奇数时就会出错,比如当这个字符串为@”哈a”时,经过前面的计算后得到的结果是3,直接除以二的结果是1(如果这都不明白是为啥的话你需要去恶补一下姿势了),而先+1再除以二之后得到的就是正确的了。而且不会影响length为偶数的结果。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注