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