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

首先,這個肯定是不行的,你如果讓使用者輸入了,并且儲存成功後,但是顯示的卻是?,這讓人怎麼了解,而且使用者的體驗肯定不好!于是,我就開始在網上百度,但是百度的結果不符合我的意思,我又請教了 –沒有開花的樹–這位大神。
其實他是有一篇文章中寫到了,由于我們是用lua腳本在頁面上對資料進行處理的,是以就直接參考了這篇文章,并且實驗結果是十分成功的。
下面附上我從沒有開花的樹 的部落格中相關的内容供大家參考!
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碼就是 11100100 10111000 10000000,即 228, 184, 128
同理,0x9FA5為 11101001 10111110 10100101,即 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 = {}
local k =
while true do
if k > #s then break end
local c = string.byte(s,k)
if not c then break end
if c< then
if (c>= and c<=) or (c>= and c<=) or (c>= and c<=) then
table.insert(ss, string.char(c))
end
k = k +
elseif c< then
k = k +
elseif c< then
if c>= and c<= then
local c1 = string.byte(s,k+)
local c2 = string.byte(s,k+)
if c1 and c2 then
local a1,a2,a3,a4 = ,,,
if c == then a1 =
elseif c == then a2,a4 = ,c1 ~= and or
end
if c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then
table.insert(ss, string.char(c,c1,c2))
end
end
end
k = k +
elseif c< then
k = k +
elseif c< then
k = k +
elseif c< then
k = k +
end
end
return table.concat(ss)
end
經過我的驗證,這段代碼确實十分有效的限制住了特殊字元。希望大家遇到類似的問題可以參考下!