首先,我們要對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***xx
10******
16u+0800
u+ffff
31110***x
10******
10******
21u+10000
u+1fffff
411110***
10******
10******
10******
26u+200000
u+3ffffff
5111110xx
10******
10******
10******
10******
31u+4000000
u+7fffffff
61111110x
10******
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...