Lua 刪除UTf 8編碼中的特殊字元

2021-08-04 13:34:10 字數 2810 閱讀 4101

首先,我們要對utf-8有乙個基本的認識,根據wiki上面的解釋:

utf-8使用一至六個位元組為每個字元編碼(儘管如此,2023年11月utf-8被rfc 3629重新規範,只能使用原來unicode定義的區域,u+0000到u+10ffff,也就是說最多四個位元組):

1. 128個us-ascii字元只需乙個位元組編碼(unicode範圍由u+0000至u+007f)。

2. 帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個位元組編碼(unicode範圍由u+0080至u+07ff)。

3. 其他基本多文種平面(bmp)中的字元(這包含了大部分常用字,如大部分的漢字)使用三個位元組編碼(unicode範圍由u+0800至u+ffff)。

4. 其他極少使用的unicode 輔助平面的字元使用四至六位元組編碼(unicode範圍由u+10000至u+1fffff使用四位元組,unicode範圍由u+200000至u+3ffffff使用五位元組,unicode範圍由u+4000000至u+7fffffff使用六位元組)。

unicode 和 utf-8 之間的轉換關係表 (x字元表示碼點佔據的位 )碼點的位數

碼點起值

碼點終值

位元組序列

byte 1

byte 2

byte 3

byte 4

byte 5

byte 6

7u+0000

u+007f

10******x

11u+0080

u+07ff

2110***xx10******

16u+0800

u+ffff

31110***x10******10******

21u+10000

u+1fffff

411110***10******10******10******

26u+200000

u+3ffffff

5111110xx10******10******10******10******

31u+4000000

u+7fffffff

61111110x10******10******10******10******10******

有了基本的認識之後,我們現在假設,只需要乙個位元組或三個位元組的長度的字元。為了判斷乙個字元是多少個位元組,我們需要乙個函式來判斷utf-8的第乙個位元組的連續的1的位有多少個(從最高位開始):

lua5.3版本

--獲取乙個位元組中,從最高位開始連續的1的個數

function get_continuous_1_count_of_byte(num)

if nil == num then

return -1

endlocal count = 0

while (num & 0x80 ~= 0) do

count = count + 1

num = num << 1

endreturn count

end

接下來是刪除特殊字元的函式:

-- 刪除字串中的特殊字元,特殊字元指代 utf-8 編碼中位元組數大於或等於4個位元組和2個位元組的的符號

function delete_special_char(raw_string)

if nil == raw_string or string.len(raw_string) == 0 then

return raw_string

endlocal new_string = {}

local index_of_raw_string = 1

while index_of_raw_string <= string.len(raw_string) do

local count_1_of_byte = get_continuous_1_count_of_byte(string.byte(raw_string, index_of_raw_string))

if count_1_of_byte < 0 then

return raw_string

endif 0 == count_1_of_byte then

count_1_of_byte = 1

endif count_1_of_byte <= 3 and count_1_of_byte ~= 2 then

for i = 0, count_1_of_byte - 1 do

table.insert(new_string, string.char(string.byte(raw_string, index_of_raw_string + i)))

endend

index_of_raw_string = index_of_raw_string + count_1_of_byte

endreturn table.concat(new_string)

end

這樣就只剩下bmp和ascii碼的字元了。

UTF 8編碼中BOM的檢測與刪除

所謂bom,全稱是byte order mark 它是乙個unicode字元,通常出現在文字的開頭,用來標識位元組序 big little endian 除此以外還可以標識編碼 utf 8 16 32 如果出現在文字中間,則解釋為zero width no break space 注 unicode...

介紹utf8編碼

utf8並不算是一種電腦編碼,而是一種儲存和傳送的格式,如前所述,每個unicode ucs字元都以 2或4個bytes來儲存,看看以下的比較 以 i am chinese 為例 用ansi儲存 12 bytes 用unicode ucs2儲存 24 bytes 2 bytes header 用uc...

UTF8編碼 解碼

參考文件 rfc3629標準.對於任意乙個字,都可以用乙個唯一碼 unicode碼,由標準編制 表示,在應用過程中,需要對碼進行編碼.常用的編碼方式為utf 8.utf 8採用類似於ip位址分配的機制.即對於不同範圍的unicode碼,採用不同的模板進行編碼.流程概述為 2.1 查表獲取unicod...