一个把中文字符串转成拼音串的函数
来源:互联网 发布:物流软件功能 编辑:程序博客网 时间:2024/05/16 12:12
处理本身并不复杂,关键是需要一个中文拼音字库。在网上找了半天,字库很少,错误很多。后来用Win2003微软拼音输入法的逆转换生成文本文件,再导进表里。具体步骤和源代码如下:
1. 逆转换微软拼音输入法字库
我用的Imegenp.exe,在逆转换标签代开文件 C:WINDOWSsystem32WINPY.MB,在码表原文件中输入 C:WINPY.TXT,生成文本文件。
2. 编辑 WINPY.TXT 并倒入字库表
字库表的结构:
CREATE TABLE CHINESECHARACTERBASE
(
HZ VARCHAR2(4 BYTE), -- 汉字
PY1 VARCHAR2(20 BYTE), -- 拼音
PY2 VARCHAR2(20 BYTE) -- 预留
)
这步需要一些简单的处理,因为文本文件的格式有些问题,比如包括词组、中文与拼音之间没有分隔符等。至于如何格式化,各有各的高招,相关的细节这里就不多说了,总之不要去手工编辑那五万多行就行。
3. 写一个转换函数,源代码如下:
CREATE OR REPLACE FUNCTION fn_chinese_to_py (
p_chinese IN VARCHAR2,
p_flag IN INT
)
RETURN VARCHAR2
IS
v_length INT := 0;
v_character VARCHAR2 (20) := '';
v_tmp VARCHAR2 (20) := '';
v_str VARCHAR2 (4000) := '';
BEGIN
v_length := LENGTH (p_chinese);
IF v_length = 0
THEN
RETURN ('ERROR!');
END IF;
FOR i IN 1 .. v_length
LOOP
BEGIN
v_tmp := SUBSTR (p_chinese, i, 1);
SELECT py1
INTO v_character
FROM (SELECT py1
FROM chinesecharacterbase
WHERE hz = v_tmp)
WHERE ROWNUM = 1;
CASE p_flag
WHEN 1 -- 全部大写
THEN
v_str := v_str || LOWER (v_character);
WHEN 2
THEN -- 全部小写
v_str := v_str || UPPER (v_character);
WHEN 3
THEN -- 首字母大写
v_character := UPPER (SUBSTR (v_character, 1, 1)) || LOWER (SUBSTR (v_character, 2));
v_str := v_str || v_character;
WHEN 4
THEN
v_character := UPPER (SUBSTR (v_character, 1, 1));
v_str := v_str || v_character;
WHEN 5
THEN
v_character := LOWER (SUBSTR (v_character, 1, 1));
v_str := v_str || v_character;
ELSE
v_str := v_str || v_character;
END CASE;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_str := v_str || v_tmp;
END;
END LOOP;
RETURN v_str;
END fn_chinese_to_py;
/
4. 测试
select fn_chinese_to_py('中华人民共和国',1) from dual -- 全部小写
zhonghuarenmingongheguo
select fn_chinese_to_py('中华人民共和国',2) from dual; -- 全部大写
ZHONGHUARENMINGONGHEGUO
select fn_chinese_to_py('中华人民共和国',3) from dual; -- 首字母大写
ZhongHuaRenMinGongHeGuo
select fn_chinese_to_py('中华人民共和国',4) from dual; -- 只取首字母大写
ZHRMGHG
select fn_chinese_to_py('中华人民共和国',5) from dual; -- 只取首字母小写
zhrmghg
5. 遗留问题
多音字处理,这是个棘手的问题。
1. 逆转换微软拼音输入法字库
我用的Imegenp.exe,在逆转换标签代开文件 C:WINDOWSsystem32WINPY.MB,在码表原文件中输入 C:WINPY.TXT,生成文本文件。
2. 编辑 WINPY.TXT 并倒入字库表
字库表的结构:
CREATE TABLE CHINESECHARACTERBASE
(
HZ VARCHAR2(4 BYTE), -- 汉字
PY1 VARCHAR2(20 BYTE), -- 拼音
PY2 VARCHAR2(20 BYTE) -- 预留
)
这步需要一些简单的处理,因为文本文件的格式有些问题,比如包括词组、中文与拼音之间没有分隔符等。至于如何格式化,各有各的高招,相关的细节这里就不多说了,总之不要去手工编辑那五万多行就行。
3. 写一个转换函数,源代码如下:
CREATE OR REPLACE FUNCTION fn_chinese_to_py (
p_chinese IN VARCHAR2,
p_flag IN INT
)
RETURN VARCHAR2
IS
v_length INT := 0;
v_character VARCHAR2 (20) := '';
v_tmp VARCHAR2 (20) := '';
v_str VARCHAR2 (4000) := '';
BEGIN
v_length := LENGTH (p_chinese);
IF v_length = 0
THEN
RETURN ('ERROR!');
END IF;
FOR i IN 1 .. v_length
LOOP
BEGIN
v_tmp := SUBSTR (p_chinese, i, 1);
SELECT py1
INTO v_character
FROM (SELECT py1
FROM chinesecharacterbase
WHERE hz = v_tmp)
WHERE ROWNUM = 1;
CASE p_flag
WHEN 1 -- 全部大写
THEN
v_str := v_str || LOWER (v_character);
WHEN 2
THEN -- 全部小写
v_str := v_str || UPPER (v_character);
WHEN 3
THEN -- 首字母大写
v_character := UPPER (SUBSTR (v_character, 1, 1)) || LOWER (SUBSTR (v_character, 2));
v_str := v_str || v_character;
WHEN 4
THEN
v_character := UPPER (SUBSTR (v_character, 1, 1));
v_str := v_str || v_character;
WHEN 5
THEN
v_character := LOWER (SUBSTR (v_character, 1, 1));
v_str := v_str || v_character;
ELSE
v_str := v_str || v_character;
END CASE;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
v_str := v_str || v_tmp;
END;
END LOOP;
RETURN v_str;
END fn_chinese_to_py;
/
4. 测试
select fn_chinese_to_py('中华人民共和国',1) from dual -- 全部小写
zhonghuarenmingongheguo
select fn_chinese_to_py('中华人民共和国',2) from dual; -- 全部大写
ZHONGHUARENMINGONGHEGUO
select fn_chinese_to_py('中华人民共和国',3) from dual; -- 首字母大写
ZhongHuaRenMinGongHeGuo
select fn_chinese_to_py('中华人民共和国',4) from dual; -- 只取首字母大写
ZHRMGHG
select fn_chinese_to_py('中华人民共和国',5) from dual; -- 只取首字母小写
zhrmghg
5. 遗留问题
多音字处理,这是个棘手的问题。
- 一个把中文字符串转成拼音串的函数
- 使用pinyin4j库把中文转成拼音
- 支持中文的把普通字符串转成二进制字符串的函数
- 支持中文的把普通字符串转成二进制字符串
- 获取中文字符串拼音首字母串的函数
- 两种将中文转成中文拼音的方法
- 一个金额转成中文大写的函数
- 把一个字符串转成double类型的数[# 61]
- 把一个字符串转成double类型的数
- 把一个字符串转成double类型的数
- 把一个字符串的首字母转成大写,其余为小写。(
- 用VB把数字转成中文字符串
- 中文转成拼音算法
- android 中文转成拼音
- 一个把时间戳转成日期的javascript函数
- Oracle自定义一个把 IP 地址转成整数的函数
- 能把汉字转化为拼音的一个函数
- 能把汉字转化为拼音的一个函数
- 在pl/sql中调用shell命令
- 用 ref cursor 返回结果集并得到记录条数的问题
- C++ Primer 笔记
- 转帖--IT圈子里鬼混---谈谈IT行业的一些生存之道!
- [java]一个多线程引起的死锁(class初始化,锁)
- 一个把中文字符串转成拼音串的函数
- 数据库中死锁的查找及处理
- 交叉报表sql语句使用
- mantis中人员名称能否显示真实姓名
- Spring之struts+hibernate+spring添删改查示例(二)
- 一个数据库解锁的存储过程sp_who_lock
- 一个屏蔽部分电话号码的函数
- ERP实施 浅谈实施顾问的三大核心素质[转]
- 用TestDirector的测试管理的流程