專案裡遇到用string.sub擷取中文字串會擷取出來非空,但是無法展示的情況,進行utf字串處理後ok.
核心部分是utf字串的判斷:
-- utf-
8 字元處理
local function stringtotable
(s) local tb =--[
[ utf8的編碼規則:
1. 字元的第乙個位元組範圍: 0x00—0x7f(0
-127
),或者 0xc2—0xf4
(194
-244);
2. utf8 是相容 ascii 的,所以 0
~127 就和 ascii 完全一致
3.0xc0
,0xc1
,0xf5—0xff
(192
,193 和 245
-255
)不會出現在utf8編碼中
4.0x80—0xbf
(128
-191
)只會出現在第二個及隨後的編碼中(針對多位元組編碼,如漢字)]]
for utfchar in string.
gmatch
(s,"[%z\1-\127\194-\244][\128-\191]*")do
table.
insert
(tb, utfchar)
endreturn tb
end
逐字列印效果的實現可以借助於 生成的 stable
-- 引數index是列印字的索引
function class:
popstr
(index)
if index ==
1 then
_stable =
stringtotable()
endindex = index +
1if index <= #_stable then
local str =
""for i,
char in ipairs
(_stable)
doif i <= index then
ifchar
=="[" then
if _stable[i+
1] and _stable[i+1]
=="-" then
index = index+
2else
index = index+
7 end
endstr = str .
.char
else
break
endend
return str
endreturn false
end
補充strig.gmatchstring.gmatch()建立並返回乙個迭代器,可用於for語句中迭代的進行全域性查詢。
迭代器每執行一次返回乙個找到的字串,如果在模式串中用圓括號指定的匹配分組,
則返回值有多個分別對應各個匹配分組的捕獲結果。分組可以相互巢狀,捕獲結果返
的順序對應模式串中匹配分組的左圓括號出現的前後順序。如果你希望第乙個返回值
是匹配結果的完整字串,那麼請將整個模式串包含在一對圓括號內。
"") string.gmatch 全域性查詢子串,每個括號指定的乙個分組匹配(對應乙個分組捕獲,
在泛型for中增加乙個返回值)
與 string.match 不同,string.gmatch發現乙個完整匹配以後,會繼續向後查詢,
pattern =
//\s*href\s*=\s*\"?\'?([:\w\./@]+)\"?\'?\s*
for href in string.
gmatch
(strhtmlcode, pattern)
{我們解釋一下模式串 "\s*href\s*=\s*\"?\'?([:\w\./@]+)\"?\'?\s*"
\是轉義符
\s表示空白字元
\s*表示空白字元出現一次或多次
\"表示引號
( \轉義符的使用與普通字串相同 )
?表示出現一次或零次
\w表示字母和數字
\.表示.(因為.是特殊字元,所以需要\還原)
是乙個自定義的字元類,如[0-
9]匹配所有數字
+是修飾符表示前面的字元出現一次或多次
UTF 8字元處理
參考 utf 8格式位元組 4中情況分別是 1 乙個位元組 0 x,低7位為有效資料,內碼是0x0 0x7f 2 兩個位元組 110 xx 10yyyyyy,低5位 低6位為有效資料,內碼是0x80 0x7ff 3 三個位元組 1110 x 10yyyyyy 10zzzzzz,低4位 低6位 低6位...
UTF 8字串在lua中的字長問題
utf 8字串在lua中每個字元的字長是不一樣,中文,英文,其他字元。都有各自不同的字長,所以utf 8也叫作變長字元。規則如下 1.utf8字元是變長字元 2.字元長度有規律 utf 8字元規律 字串的首個byte表示了該utf8字元的長度 0 x 1 byte 110y x 192,2 byte...
PHP正確解析UTF 8字串
在 學習php mysql之 字元編碼篇 一 中介紹了unicode與utf 8的轉換關係,總結了乙個utf 8的編碼規則,根據這個編碼規則,寫乙個utf 8編碼的解析程式,以下是php的實現 view code 程式功能,str是中英文混合的utf 8編碼字串,將此字串根據utf 8的編碼規則正確...