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

处理本身并不复杂,关键是需要一个中文拼音字库。在网上找了半天,字库很少,错误很多。后来用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. 遗留问题
多音字处理,这是个棘手的问题。
 
在 SQL Server 中,可以使用 CLR(公共语言运行时)来实现将汉字转换为拼音的功能。以下是一个基本的CLR函数示例: 1. 创建一个新的CLR项目 2. 在项目中添加一个新的类,并替换代码如下: ```csharp using System; using System.Data.SqlTypes; using System.Globalization; using Microsoft.SqlServer.Server; using System.Text; using System.Text.RegularExpressions; public class Pinyin { [SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)] public static SqlString Convert(SqlString input) { if (input.IsNull) return SqlString.Null; string str = input.Value.Trim(); if (string.IsNullOrEmpty(str)) return SqlString.Empty; StringBuilder builder = new StringBuilder(); foreach (char c in str) { if (Regex.IsMatch(c.ToString(), @"[\u4e00-\u9fa5]")) { builder.Append(GetPinyin(c)); } else { builder.Append(c); } } return builder.ToString(); } private static string GetPinyin(char c) { CultureInfo culture = new CultureInfo("zh-CN"); TextInfo textInfo = culture.TextInfo; string pinyin = textInfo.ToTitleCase(new ChineseChar(c).Pinyins[0]).Replace(" ", ""); return pinyin.Substring(0, pinyin.Length - 1); } } ``` 3. 将项目编译为DLL文件,并将其注册到SQL Server中: ```sql CREATE ASSEMBLY Pinyin FROM 'C:\Pinyin.dll' -- 替换为DLL文件路径 WITH PERMISSION_SET = SAFE; CREATE FUNCTION dbo.fn_Pinyin (@input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS EXTERNAL NAME Pinyin.[Pinyin.Pinyin].Convert; ``` 现在,您可以使用以下SQL语句来调用此函数: ```sql SELECT dbo.fn_Pinyin('你好,世界') -- 输出 'nǐhǎo,shìjiè' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值