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