lua如何擷取中英文混合字串

2021-07-03 02:32:50 字數 2408 閱讀 6628

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...