1 建表保存拼音、拼音首字母、和汉字的对照表。
脚本如下:
CREATE TABLE [dbo].[SYS_ChinesePY](
[ID] [int] IDENTITY(1,1) NOT NULL,
[PYFIRST] [char](1) NULL,
[PYALL] [varchar](50) NULL,
[WORD] [nvarchar](1) NULL,
CONSTRAINT [PK_SYS_ChinesePY] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
可以从这里下载很全的拼音对照表的excel数据进行导入
https://download.csdn.net/download/postfxj/10563056
2 实现任意文字转拼音和首字母的收集(c#方法,如果不想导入也可以用下面的方法自行收集)。
2.1先下载Mcrosoft visual studio international pack并安装在任意一台电脑上
2.2 进C:\Program Files (x86)\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library文件夹复制
chnCharInfo.dll文件到vs开发工具的电脑上,在项目中引用该文件。
2.3 相关取拼音的类文件如下
此类中一定要引用
using Microsoft.International.Converters.PinYinConverter;
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.International.Converters.PinYinConverter;
namespace POS
{
class CS_Chinese
{
/// 获得单个字符的拼音
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public static string GetPinYin(char c)
{
ChineseChar cc = new ChineseChar(c);
string str = cc.Pinyins[0]; //多音字只取第一个
return str.Substring(0, str.Length - 1); //去掉最后的声调
}
/// 获得一个字符串的拼音
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
/// /// <summary>
public static string GetPinYin(string str)
{
StringBuilder sb = new StringBuilder();
foreach (char item in str)
{
//判断是不是汉字,如果不是原字符返回
if (ChineseChar.IsValidChar(item))
{
sb.Append(GetPinYin(item));
}
else
{
sb.Append(item);
}
}
return sb.ToString();
}
}
}
2.4 用上面的方法可以收集汉字来把数据插入到对照表中
以下是我以任何表中的某个栏位来收集对像进行收集的方法的样例。
private void btnSJPY_Click(object sender, EventArgs e)
{
waiting w = new waiting();
try
{
w.Show();
if (dgvData.Rows.Count > 0)
for (int i = 0; i < dgvData.Rows.Count; i++)
{
string s = dgvData.Rows[i].Cells[txtField.Text].Value.ToString();
for (int j = 0; j < s.Length; j++)
{
string sWord = s.Substring(j, 1);
string sGBWord = ConvertSCTC.TCTOSCConvert(sWord);//簡體字
string sBIGWord = ConvertSCTC.SCTOTCConvert(sGBWord);//繁體字
string sGBPY = CS_Chinese.GetPinYin(sGBWord);
string sBIGPY = CS_Chinese.GetPinYin(sBIGWord);
if (sGBWord != sGBPY)
{
string sql = "Select * FROM SYS_ChinesePY WHERE Word=N'" + sGBWord + "'";
bool isData = WEBPOS.IsExit(BASEINFO.DESEncrypt(sql));
if (!WEBPOS.IsExit(BASEINFO.DESEncrypt(sql)))
{
sql = "insert into SYS_ChinesePY(PYFIRST,PYALL,WORD) VALUES(N'" + sGBPY.Substring (0,1) +"',N'" + sGBPY + "',N'" + sGBWord + "')";
WEBPOS.SQLcmd(BASEINFO.DESEncrypt(sql));
}
}
if (sBIGWord != sBIGPY)
{
string sql = "Select * FROM SYS_ChinesePY WHERE Word=N'" + sBIGWord + "'";
bool isData = WEBPOS.IsExit(BASEINFO.DESEncrypt(sql));
if (!WEBPOS.IsExit(BASEINFO.DESEncrypt(sql)))
{
sql = "insert into SYS_ChinesePY(PYFIRST,PYALL,WORD) VALUES(N'" + sBIGPY.Substring(0, 1) + "',N'" + sBIGPY + "',N'" + sBIGWord + "')";
WEBPOS.SQLcmd(BASEINFO.DESEncrypt(sql));
}
}
}
}
}
finally
{
w.Close();
}
}
3 SQL Server中实现翻译的方法
创建如下标量值函数:
CREATE FUNCTION [dbo].[procGetPY]
(
@str NVARCHAR(4000)
)
/*
select dbo. procGetPYFirstLetter ('中國')
*/
RETURNS NVARCHAR(4000)
--WITH ENCRYPTION
AS
BEGIN
DECLARE @WORD NCHAR(1),@PY NVARCHAR(4000)
SET @PY=''
WHILE LEN(@STR)>0
BEGIN
SET @WORD=LEFT(@STR,1)
--如果非漢字字符﹐返回原字符
SET @PY=@PY+' '+RTRIM((CASE WHEN UNICODE(@WORD) BETWEEN 19968 AND 19968+20901
THEN (
SELECT TOP 1 PY
FROM
(
select PYALL PY,WORD
from sys_chinesePY
) T
WHERE WORD=@WORD
ORDER BY PY ASC
)
ELSE @WORD
END) )
SET @STR=RIGHT(@STR,LEN(@STR)-1)
END
RETURN @PY
END
调用方法:select dbo. procGetPYFirstLetter ('我爱你哟')