lua中過濾表情以及特殊字元

2021-07-24 17:03:58 字數 2493 閱讀 3528

今天開發時發現,備註輸入框中可以輸入表情符號,然而再次展示時,卻成了問號?或者直接在請求介面的時候顯示資料格式不正確!

lua5.3雖然支援utf-8,但是自帶的string庫不支援漢字的處理,而且lua的正則實現也比較雞肋,很難匹配中文。所以文章討論utf-8字符集,中文漢字的表示方法,然後說明lua如何匹配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字符集表示的是一樣的。

通常都說到,漢字範圍從0x4e00到0x9fa5,這是指unicode編碼。對於utf-8還要做轉換。

其中,0x4e00 用二進位制表示為 100111000000000

換成utf-8碼就是 11100100 10111000 10000000,即 228, 184, 128

同理,0x9fa5為 11101001 10111110 10100101,即 233, 190, 165

可以看出,中文utf-8編碼用3個位元組表示。

前面分析了中文utf-8的編碼範圍了,所以lua只要用 string.byte(s, i) 取到字元的byte值(字符集通常記 code point)。比較第乙個位元組是228-233,而且接下來兩個位元組都是 128-191,就可以簡單認定為中文了。

這裡以乙個例子說明,比如我要過濾特殊字元,保留中文、英文和數字。

function

filter_spec_chars(s)

local ss = {}

local k = 1

while

true

doif k > #s then break end

local c = string.byte(s,k)

ifnot c then break end

if c<192

then

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

endk = k + 1

elseif c<224

then

k = k + 2

elseif c<240

then

if 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,c1 ~= 190

and191

or165

end if c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then

table.insert(ss, string.char(c,c1,c2))

endend

endk = k + 3

elseif c<248

then

k = k + 4

elseif c<252

then

k = k + 5

elseif c<254

then

k = k + 6

end end

return table.concat(ss)

end

經過我的驗證,這段**確實十分有效的限制住了特殊字元。希望大家遇到類似的問題可以參考下!

lua中過濾表情以及特殊字元

今天開發時發現,備註輸入框中可以輸入表情符號,然而再次展示時,卻成了問號?或者直接在請求介面的時候顯示資料格式不正確!首先,這個肯定是不行的,你如果讓使用者輸入了,並且儲存成功後,但是顯示的卻是,這讓人怎麼理解,而且使用者的體驗肯定不好!於是,我就開始在網上,但是的結果不符合我的意思,我又請教了 沒...

access中過濾特殊字元「 」

今匯入資料庫的時候發現出錯了,資料庫訪問失敗,以為是程式的問題最後發現是採集回來的資料有問題,主要是access裡的特殊字字元 在搞鬼。原來資料裡面有個單獨的 而沒有 不包含引號 於是我修改一下把缺少 加上就能匯入了,原來是採集的資料少了個 我用access開啟資料庫想把資料名稱裡面的 和 全都去掉...

過濾特殊字元

過濾特殊字元 public static string encoding string src 利用反射呼叫乙個繼承層次上的函式族,比如安裝程式,有安裝資料庫的,安裝檔案系統的等,命名均已 install 開始,你就可以將引數part設為 install src是其實類例項,root是終止父類 pu...