【Lua进阶系列】分割中英文字符串

   

    大家好,我是Lampard猿奋~~

    欢迎来到Lua进阶系列的博客,今天和大家分享一下lua如何分割中英文字符串

lua中怎么输出空格 lua 中文字符如何_UI

 (1)需求背景

      最近接到了一个小需求,就是游戏中一个名称超长了。策划并不想让名字自动换行,也不想挪动其他的UI位置,于是提出了如果超过某长度就将之后的字符隐藏并用省略号代替,比如“AABBCCDD”超长了,想显示成“AABB...”

(2)初次尝试

阈值140除以实际长度,得到应该显示文本的百分比,然后再用名字的总长度乘以这个比值,就算出应该显示多少文本,最后拼接一个“...”就行了

    中英结合的名字后面出现了乱码,原因在于string.len拿到的是字符串的字节数,并不是这个字符串有多少个“字”,而英文的字节数是1,中文的字节数是3甚至有一些是4,所以不可以这样子直接去算出显示多少字节,不然这个中文就会显示不全

(3)了解utf8的编码规则

      UTF-8 的编码规则很简单:

      对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
     
对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
      如下图所示:

lua中怎么输出空格 lua 中文字符如何_字符串_02

       知道这一点之后我们就好办了,其实刚才我是错在了想按照比例算出“字”数,但是实际的操作是按比例算出了字节数,那么我们只需要把这个字符串切割成一个个中英文,就可以知道再根据比率去取舍多少个字了

(4)切割字符串

      首先肯定是从第一个字节开始,我们通过string.byte(字符串,1)拿到了第一个字节的数据,然后根据我们上文的utf8的编码规则,如果这个值大于239(1110开头)则这个是个四字节的文本,如果是223到239之间(1110)则是3字节的文本,以此类推到最后字节数小于192(0开头)的,则是1个字节的文本

一直递归知道字符串被读完为止,就成功把字符串分割啦!!

决定显示多少个数字,再换算出多少字节,通过string.sub就可以读到想要的内容了(项目代码就不方便贴啦)

 好啦今天就到这里