一个把中文字符串转成拼音串的函数

资讯 驱动中国 若水 1,132 次阅读 0 条评论
分享 Q
1. 逆转换微软拼音输入法字库
    我用的Imegenp.exe,在逆转换标签代开文件 C:\WINDOWS\system32\WINPY.MB,在码表原文件中输入 C:\WINPY.TXT,生成文本文件。
2. 编辑 WINPY.TXT 并倒入字库表
    字库表的结构:    这步需要一些简单的处理,因为文本文件的格式有些问题,比如包括词组、中文与拼音之间没有分隔符等。至于如何格式化,各有各的高招,相关的细节这里就不多说了,总之不要去手工编辑那五万多行就行。
3. 写一个转换函数,源代码如下: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. 遗留问题
多音字处理,这是个棘手的问题。
CREATE TABLE CHINESECHARACTERBASE
    (
        HZ VARCHAR2(4 BYTE), -- 汉字
        PY1 VARCHAR2(20 BYTE), -- 拼音
        PY2 VARCHAR2(20 BYTE) -- 预留
    )
 
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 -- 首字母大写#p#分页标题#e#
                        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;
/
函数 拼音 字符串 中文 一个 &nbsp v_str v_
版权声明:本文由驱动中国整理发布,转载需注明出处与原文链接。如有疑问请联系 editor@qudong.com
本文价值 成为第一个评分的人
登录后为本文打分
网友评论0 条评论
正在回复 的评论取消
评论加载中…
🔐

登录后参与互动

评论、点赞均可赚积分
连续签到、邀请好友也有奖励 🎁

电脑端: 微信扫码登录 微信内: 一键登录

微信扫一扫

打开微信「扫一扫」,分享本文到朋友圈或好友