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

  • 来源: 数据库技术网 作者: 若水   2008-05-14/19:09
  • 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;
    /

    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多