lua在utf8下乙個中文字長度為3,這樣在中英文混排時擷取字串就比較麻煩,下面的函式是中文字長度為1下的處理
-- 獲取utf8編碼字串長度,中文長度為1
function utfstrlen(str)
local len = #str;
local left = len;
local cnt = 0;
local arr=;
while left ~= 0 do
local tmp=string.byte(str,-left);
local i=#arr;
while arr[i] do
if tmp>=arr[i] then left=left-i;break;end
i=i-1;
endcnt=cnt+1;
endreturn cnt;
end--擷取中英文混合字串
--引數
-- string str 原始字串
-- number start 起始位置,注意中文長度為1
-- number len 擷取長度
--返回值
-- string 擷取後的字串
--備註
-- 1)中文utf8預設佔3個位元組,可能對於一些佔2個或4個位元組的中文處理有問題
-- 2)回車\n等特殊控制字元也算乙個長度
function subutf8string(str, start, len)
local firstresult = ""
local strresult = ""
local maxlen = string.len(str)
start = start - 1
--找到起始位置
local presite = 1
if start > 0 then
for i = 1, maxlen do
local s_dropping = string.byte(str, i)
if not s_dropping then
local s_str = string.sub(str, presite, i - 1)
presite = i + 1
break
endif s_dropping < 128 or (i + 1 - presite) == 3 then
local s_str = string.sub(str, presite, i)
presite = i + 1
firstresult = firstresult..s_str
local curlen = utfstrlen(firstresult)
if (curlen == start) then
break
endend
endend
--擷取字串
presite = string.len(firstresult) + 1
local startc = presite
for i = startc, maxlen do
local s_dropping = string.byte(str, i)
if not s_dropping then
local s_str = string.sub(str, presite, i - 1)
presite = i
strresult = strresult..s_str
return strresult
endif s_dropping < 128 or (i + 1 - presite) == 3 then
local s_str = string.sub(str, presite, i)
presite = i + 1
strresult = strresult..s_str
local curlen = utfstrlen(strresult)
if (curlen == len) then
return strresult
endend
endreturn strresult
end例如:
print(subutf8string("我愛死你們", 2, 3))
print(subutf8string("abcde", 2, 3))
print(subutf8string("我11愛死你們", 2, 3))
print(subutf8string("我1", 2, 3))
print(subutf8string("我日1愛死你們", 2, 3))
的結果是
[lua-print] 愛死你
[lua-print] bcd
[lua-print] 11愛
[lua-print] 1
[lua-print] 日1愛
Django 擷取中英文混合字串
在列表顯示的時候,我們常常要擷取文章標題的長度,python擷取字串,本來很簡單的,但是中文和英文的寬度不一樣,在頁面看起來長度就差很遠了 length7 這是中文長度七 粗略來算 是粗略哦 乙個中文字元的寬度大概等於兩個英文本元的寬度。乙個中文字元的utf8編碼長度為3,gbk為2 所以將使用gb...
C 中英文混合字串擷取函式
一 截斷字串 最大長度 原字串 public static string cutstr int maxlength,string str for int i temp.length i 0 i return 二private string getbytestring string center,in...
Oracle擷取中英文混合字串的處理
declare i int set i 30 while i 0 begin update 表 set 標題 left 標題,i where datalength left 標題,i 30 and datalength 標題 30 set i i 1 end 減少迴圈 declare i int s...