用于显示时,经常会遇到显示的文本太长需要截短的情况。如果是如 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
|