lua5.3雖然支援utf-8,但是自帶的string庫不支援漢字的處理,而且lua的正則實現也比較雞肋,很難匹配中文。所以文章討論utf-8字符集,中文漢字的表示方法,然後說明lua如何匹配utf-8中文漢字。
初識utf-8
utf-8是unicode的一種實現,是一種變長位元組編碼方式。對於某乙個字元的utf-8編碼,如果只有乙個位元組則其最高二進位制位為0;如果是多位元組,其第乙個位元組從最高位開始,連續的二進位制位值為1的個數決定了其編碼的位數,其餘各位元組均以10開頭。utf-8最多可用到6個位元組。
如表:因此,utf-8可以用來表示字元編碼最多的有效位數是31位,即x代表的位。除掉那些標誌位(如每位元組開頭的10),utf-8表示的與unicode編碼是對應的。
另外,unicode相容標準的ascii字符集,只需要乙個位元組就可以表示所有ascii碼,ascii碼一共規定了128個字元的編碼,所以實際只要7位表示。而對於1位元組表示的utf-8編碼,位元組開頭是0,所以utf-8表示的英文數字,跟ascii字符集表示的是一樣的。
中文utf-8
通常都說到,漢字範圍從0x4e00到0x9fa5,這是指unicode編碼。對於utf-8還要做轉換。
其中,0x4e00 用二進位制表示為 100111000000000
換成utf-8碼就是111001001011100010000000,即 228, 184, 128
同理,0x9fa5為 111010011011111010100101,即 233, 190, 165
可以看出,中文utf-8編碼用3個位元組表示。
lua匹配utf-8漢字
前面分析了中文utf-8的編碼範圍了,所以lua只要用 string.byte(s, i) 取到字元的byte值(字符集通常記 code point)。比較第乙個位元組是228-233,而且接下來兩個位元組都是 128-191,就可以簡單認定為中文了。
這裡以乙個例子說明,比如我要過濾特殊字元,保留中文、英文和數字。
function filter_spec_chars(s)
local ss =
for k = 1, #s do
local c = string.byte(s,k)
if not c then
break end
if(c>=48 and c<=57) or (c>= 65 and c<=90) or (c>=97 and c<=122)
then
table.insert(ss, string.char(c))
elseif c>=228 and c<=233 then
local c1 = string.byte(s,k+1)
local c2 = string.byte(s,k+2)
if c1 and c2 then
local a1,a2,a3,a4 = 128,191,128,191
if c == 228 then a1 = 184
elseif c == 233 then a2,a4 = 190,165
endif c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then
k = k + 2
table.insert(ss, string.char(c,c1,c2))
endend
endend
return table.concat(ss)
end
utf 8的中文漢字
從字元編碼講起。1 美國人首先對其英文本元進行了編碼,也就是最早的ascii碼,用乙個位元組的低7位來表示英文的128個字元,高1位統一為0 2 後來歐洲人發現尼瑪你這128位哪夠用,比如我高貴的法國人字母上面的還有注音符,這個怎麼區分,得,把高1位編進來吧,這樣歐洲普遍使用乙個全位元組進行編碼,最...
lua用UTF 8處理漢字
lua用utf 8處理漢字 utf8的編碼規則 1.字元的第乙個位元組範圍 0x00 0x7f 0 127 或者 0xc2 0xf4 194 244 utf8 是相容 ascii 的,所以 0 127 就和 ascii 完全一致 2.0xc0,0xc1,0xf5 0xff 192,193 和 245...
mysql 中utf8編碼存放中文漢字問題
今天對mysql資料庫進行操作時,發現始終存不進資料庫,搞了很久才發現這張表字元長度為varchar 20 而我存入的漢字超過了7個!經過查詢才知道漢字字元轉換問題,以前也知道,但是並沒有引起注意。乾貨如下 只適用mysql5.0以上的版本 1.乙個漢字佔多少長度與編碼有關 utf 8 乙個漢字 3...