从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以GB2312为例, 写一函数准确地从表里提取简体汉字.
假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码
并且保存到表里的汉字也都是GB2312编码的
那么也就是汉字是双字节的,且简体汉字的编码范围是
B0A1 - F7FE
换算成10进制就是
B0??A1? ? F7??FE
176,161 - 247,254
我们先看一下asciistr函数的定义
Non-ASCII characters are converted to the form /xxxx, where xxxx represents a UTF-16 code unit.
但是这并不表示以 "/" 开始的字符就是汉字了
举例如下
SQL> select * from test;
NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC
这里第5条记录有一个实心的五角星
然后用asciistr函数转换一下试试
SQL> select name,asciistr(name) from test;
NAME? ?? ?? ?? ?? ???ASCIISTR(NAME)
-------------------- ----------------------
,啊OO10哈? ?? ?? ?? ?,/554AOO10/54C8
你好aa? ?? ?? ?? ?? ?/4F60/597Daa
大家好aa/? ?? ?? ?? ?/5927/5BB6/597Daa/
☆大海123? ?? ?? ?? ?/2606/5927/6D77123
★ABC? ?? ?? ?? ?? ? /2605ABC
我们看到最后一条记录的实心五角星也是 "/"开头的
此时我们就不能用asciistr(字段)是否存在 "/" 来判断是否含有汉字了.
我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内
create?or?replace?function?get_chinese(p_name?in?varchar2)?return?varchar2
as
??v_code?????varchar2(30000)?:=?'';
??v_chinese??varchar2(4000)??:=?'';
??v_comma????pls_integer;
??v_code_q???pls_integer;
??v_code_w???pls_integer;
begin
??if?p_name?is?not?null?then
?????select?replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:?','')?into?v_code?from?dual?where?rownum=1;
?????for?i?in?1..