Lua 處理 UTF-8 字串
Posted on Mon 17 October 2016 in note
最近要用 Lua 處理 UTF-8 字串,但是 Lua 到了 5.3 才開始支援 UTF-8。
UTF-8 字串長度及複製
我的需求很簡單,只要判斷字串長度及類似 strncpy
的字串複製。所以直接利用 Lua 5.3 手冊 提到的 charpattern 來進行字串的操作。
[\0-\x7F\xC2-\xF4][\x80-\xBF]*
utf8len
:::lua
function utf8len(s)
_, len = string.gsub(s, '([\0-\x7F\xC2-\xF4][\x80-\xBF]*)', '%1')
return len
end
utf8strncpy
:::lua
function utf8strncpy(s, len)
local result = ''
local count = 0
for c in string.gmatch(s, '([\0-\x7F\xC2-\xF4][\x80-\xBF]*)') do
if count >= len then
return result
end
result = result .. c
count = count + 1
end
return result
end
範例
:::lua
a = '天天開心一二三四abcd'
print('length: #:' .. #a)
print('length: utf8len:' .. utf8len(a))
print(utf8strncpy(a, 1))
print(utf8strncpy(a, 3))
print(utf8strncpy(a, 5))
print(utf8strncpy(a, 7))
print(utf8strncpy(a, 9))
print(utf8strncpy(a, 11))
print(utf8strncpy(a, 13))
print(utf8strncpy(a, 15))
length: #:28
length: utf8len:12
天
天天開
天天開心一
天天開心一二三
天天開心一二三四a
天天開心一二三四abc
天天開心一二三四abcd
天天開心一二三四abcd