Lua(模糊查找):判斷兩個字符串(含中文)是否存在至少一個相同的中文字符

用過Lua的,應該知道lua有一個截取字符串的接口,string.sub(s,i,j),就是截取字符串s,從第i個字符到第j個字符的字串,這裏的一個字符是一個字節,對於英文字母還是阿拉伯數學,不管是utf8編碼,還是ansi(GBK)編碼,都是一樣的,而且對於漢字,前者佔3個字節,後者佔2個字節,當然還有4個字節的漢字,那如何從一個字符串比如"bg%好-+03打@/f"中準確截取出我們需要的漢字呢,這就是我們今天需要解決的問題.

其實,在今天之前,我也不知道怎麼做,我是因爲要解決一個模糊查找的需求來學習到了這些

 

首先當前遊戲代碼是以utf8編碼格式,因爲我們要面向中國玩家,而且很多英語不是非常好,哈哈,所以全寫英文的,玩家就看不懂了,如果ui顯示文字全是英文,下面的就不需要看了

        1.字符是由幾個字節組成:(16進制)

            [0, 0xc0) 表示這個字符僅由1個字節構成    [0,192)

            [0xc0, 0xe0) 表示這個字符由2個字節構成  [192,225)

            [0xe0, 0xf0) 表示這個字符由3個字節構成  [225,240)

            [0xf0, 0xff) 表示這個字符由4個字節構成  [240,255)

        2.如何取得字節ASCII碼 : 

            string.byte(s,i) 或 s:byte(i)

        3.我們先寫一個判斷utf8字符byte長度的函數:

 4.在Lua中,表(table)是十分重要的一種數據結構,實際上Lua對於複雜數據類型也僅提供了表給我們,我們通過表可以實現我們需要的大部分重要的數據結構,比如數組。我們現在只需要知道有沒有相同的中文字符,其他不關心,所以把字符串變成數據中文字符串的表就好了

我們傳入兩個參數,一個是字符串,一個是用來裝漢字的表

通常來說,漢字範圍從0x4E00到0x9FA5,轉換爲UTF-8編碼爲11100100 10111000 10000000(228, 184, 128) 到 11101001 10111110 10100101(233, 190, 165)

因此,中文UTF-8編碼用3個字節表示,要遵守格式:1110xxxx 10xxxxxx 10xxxxxx

即第一個字節的取值區間爲 [11100000, 11110000) = [0xe0, 0xf0) = [224, 240) 左開右閉

後兩個字節的取值區間爲[10000000, 10111111] = [0x80,0xbf] = [128, 191] 開區間

所以我們可以一個字節的去截取,然後計算出byte長度,如果大於3,就截取存入表中

5.寫好算法以後,我們只需傳入不同的字符串,得到不同的表,進行比較就可以了:

我們只比較兩個字符串都含有中文的情況 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章