oracle的convert函数也可以实现简繁转换,但是经测试存在一些问题,有些字转不了,比如‘宣佈’,所以自己写了一个简单的,可以实现字字对应的简繁转换。(convert函数能够实现部分的简繁转换已经很牛逼了!)
代码尾部附带一大一小两个字库,小的600多,大的3000多,请各位根据需求和执行效率自行选择,也可以在小库的基础上一步一步增加自己需要的字体。
CREATE OR REPLACE FUNCTION FN_SC_TC(OLD_STRING in VARCHAR2,FUN_TYPE in NUMBER := 1)
--OLD_STRING为要转的字符串,FUN_TYPE为转换方式,1为繁转简,2为简转繁,默认繁转简
RETURN VARCHAR2 AS
--简体字库,必须与繁体字库一一对应,详细的字库见末尾
V_SC_LIST constant LONG := '爱碍袄肮罢坝';
--繁体字库,必须与简体字库一一对应,详细的字库见末尾
V_TC_LIST constant LONG := '愛礙襖骯罷壩';
V_NEW_STRING varchar2(2000);--将要返回的新字符串
V_LENGTH NUMBER(12) := length(OLD_STRING);--字符串总长度
V_INDEX Number(12) := 1;--字符串的游标
V_TEMP Number(12) := 0;--繁体中文对应简体中文在LIST中的位置
V_FROM LONG := V_TC_LIST;--不知道这样搞一下,constant还有没有优化的效果了
V_TO LONG := V_SC_LIST;
BEGIN
IF FUN_TYPE = 2 THEN --简体转繁体
V_FROM := V_SC_LIST;
V_TO := V_TC_LIST;
END IF;
LOOP
IF V_INDEX <= V_LENGTH THEN--遍历整个字符串
V_TEMP := INSTR(V_FROM,substr(OLD_STRING,V_INDEX,1));--查找某个字符是否是繁体字
IF V_TEMP <> 0 THEN--若是繁体字
--使用简体字库对应的简体字替换该繁体字
V_NEW_STRING := V_NEW_STRING || substr(V_TO,V_TEMP,1);
V_TEMP := 0;
ELSE
V_NEW_STRING := V_NEW_STRING || substr(OLD_STRING,V_INDEX,1);
END IF;
V_INDEX := V_INDEX + 1;
ELSE
EXIT;
END IF;
END LOOP;
return V_NEW_STRING;
END FN_SC_TC;
大字库必需要将每行分开,不然在执行的时候可能会报ORA-06502的错误,并且因其长度超过了PL\SQL编辑框的限制,显示的时候会有文字解码错误的BUG。
相关错误描述请见:ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 错误分析
若各位有相关的建议或想法,欢迎讨论