oracle判斷漢字和全形字符的方法 轉

2022-02-10 23:40:47 字數 1389 閱讀 1404

最近由於單位提了乙個需求,要判斷提供的使用者名稱裡不有全形字符,至少有兩個漢字。找了半天,想通過正規表示式來解決,但測試了好久才發現,

oracle

的正則函式regexp_like 不支援「\un 匹配 n,其中 n 是以四位十六進製制數表示的 unicode 字元」的判斷,例如,\u00a9 匹配版權符號 (©

,而標準的正則是可以支援的,所以這個辦法行不通,只能過期其他辦法來實現。

在網上找了半天,都沒有確切的實現辦法,有通過length()和lengthb ()來判斷,但不完美,都不太所以就把自己的寫法記錄下來希望能有用處。

對於全形字符,ascii值的範圍是\uff00-\uffff,都是ff段的,所以可以通過轉換成ascii 來判斷,instr(asciistr(replace( '在《<23\', '\')),'\ff',1,1) > 0 就可以實現

對於漢字,範圍太大,只能通過函式來完成,於是寫了如下函式:

create or replace function get_chinese(v_name in varchar2) return integer is

i       int;

v_count integer;

v_code  varchar2(10);

begin

v_count := 0;

/**用途:   返回字串中漢字的個數

原理說明:  因為漢字的ascii碼值在4e00和9fa5之間,所以,可以將字串轉為ascii後,判斷連續的5位是否在這個範圍,

是則為漢字,否則為其他字元。

返回值:    漢字個數

異常返回:  -1

*/for i in 1 .. lengthb(asciistr(v_name)) - 4 loop  

--if substr(asciistr(v_name),i,1)='\' then --有\則判斷是否漢字

v_code := substr(asciistr(v_name), i, 5);

if v_code between '\4e00' and '\9fa5' then

--漢字的asciid碼值範圍

v_count := v_count + 1; --有乙個漢字

end if;

-- dbms_output.put_line(v_code);

-- end if;

end loop;

return v_count;

exception

when others then

return - 1; --異常返回-1

end get_chinese;

查詢結果:

全形字符轉換為半形,判斷半形和全形

判斷字元是否英文半形字元或標點 32 空格 33 47 標點 48 57 0 9 58 64 標點 65 90 a z 91 96 標點 97 122 a z 123 126 標點 public static bool isbjchar char c 判斷字元是否全形字符或標點 全形字符 65248...

什麼是全形字符

就是太陽和月亮的區別,鍵盤上有!你可以用 shift 空格 鍵來切換全形和半形 或者用英文輸入 簡單地講,全形字符占用2個字元位置,半形字元占用1個字元位置。他們在應用上的區別主要表現在輸入阿拉伯數目字 英文本母 標點符號 特殊符號,這些只需要佔1個字元位的一般用半形輸入。如果用全形輸入的話,每兩個...

java 全形字符轉半形字元

專案中正好要用到全半形字元互轉,收藏下以後備用 public class test 全形空格為12288,半形空格為32 其他字元半形 33 126 與全形 65281 65374 的對應關係是 均相差65248 將字串中的全形字符轉為半形 param src 要轉換的包含全形的任意字串 retur...