用于显示时,经常会遇到显示的文本太长需要截短的情况。如果是如 ASCII 这样的定长编码,截短到指定长度自然不成问题。可如果源字符串是 UTF-8 编码的呢?ANSI C 里只管字节不管编码,所以如果想只用 ANSI C 提供的功能的话,就只能自己写了。因为需求仅仅是截短字符串而已,也不要求多么精确,所以没有去做编解码,只是丢弃按字节截短后的字符串最后的无效编码而 已。而且目标语种是 Lua,也不方便搞位操作。
查维基百科可知,UTF-8 多字节字符第一字节的最高两位为11
,而其它字节的最高两位均为10
。所以就把后面那些10xxxxxx
连同最开始的11xxxxxx
去掉好了。这样会多截掉一个多字节字符,但无所谓了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function truncateUTF8String(s, n) local r = string.sub (s, 1 , n) local last = string.byte (r, n) if not last then return r end while last >= 128 and last <= 192 do n = n - 1 r = string.sub (r, 1 , n) last = string.byte (r, n) end if last >= 128 then r = string.sub (r, 1 , n- 1 ) end return r end |