///////////////////////////////////////////////////////////////////////////// // FileName: PY.pas // // Copyright (C) 1999 By Zhang Qing // // You can use and modify it ,but please send me an email. // // E-Mail: [email protected] ///////////////////////////////////////////////////////////////////////////// unit PY;interface uses sysutils;// 获取汉字的拼音首字符,这个函数将用在GetPYIndexStr 中. function GetPYIndexChar(strChinese: string; bUpCase: Boolean = True): char;// 获取多个汉字的拼音首字符组成的字符串. function GetPYIndexStr(strChinese: string; bUpCase: Boolean = True): string;implementation//////////////////////////////////////////////////////////////////////////// // 函数: GetPYIndexChar(strChinese: string;bUpCase: Boolean = True): char; // // 函数功能:获取汉字的拼音首字符. // 例: GetPYIndexChar('程') 将返回'C'. // // 注意:对于多于一个汉字的输入(string类型)只有第一个有效,但不会产生错误 // 例如,GetPYIndexChar('程序')也将返回'C'. // // 第二个参数决定返回大写还是小写 , 缺省为大写 . //////////////////////////////////////////////////////////////////////////// function GetPYIndexChar(strChinese: string;bUpCase: Boolean = True): char; begin // 根据汉字表中拼音首字符分别为“A”至“Z”的汉字内码范围, // 要检索的汉字只需要检查它的内码位于哪一个首字符的范围内, // 就可以判断出它的拼音首字符。 case WORD(strChinese[1]) shl 8 + WORD(strChinese[2]) of $B0A1..$B0C4 : result := 'A'; $B0C5..$B2C0 : result := 'B'; $B2C1..$B4ED : result := 'C'; $B4EE..$B6E9 : result := 'D'; $B6EA..$B7A1 : result := 'E'; $B7A2..$B8C0 : result := 'F'; $B8C1..$B9FD : result := 'G'; $B9FE..$BBF6 : result := 'H'; $BBF7..$BFA5 : result := 'J'; $BFA6..$C0AB : result := 'K'; $C0AC..$C2E7 : result := 'L'; $C2E8..$C4C2 : result := 'M'; $C4C3..$C5B5 : result := 'N'; $C5B6..$C5BD : result := 'O'; $C5BE..$C6D9 : result := 'P'; $C6DA..$C8BA : result := 'Q'; $C8BB..$C8F5 : result := 'R'; $C8F6..$CBF9 : result := 'S'; $CBFA..$CDD9 : result := 'T'; $CDDA..$CEF3 : result := 'W'; $CEF4..$D188 : result := 'X'; $D1B9..$D4D0 : result := 'Y'; $D4D1..$D7F9 : result := 'Z'; else result := char(0); end; if not bUpCase then begin // 转换为小写 result := Chr(Ord(result)+32); end; end;//////////////////////////////////////////////////////////////////////////// // 函数: GetPYIndexStr(strChinese: string;bUpCase: Boolean = True): string; // // 函数功能:获取多个汉字的拼音首字符组成的字符串. // 例: GetPYIndexStr('程') 将返回'C'. // GetPYIndexStr('程序')将返回'CX'. // // 第二个参数决定返回大写还是小写 , 缺省为大写 . //////////////////////////////////////////////////////////////////////////// function GetPYIndexStr(strChinese: string;bUpCase: Boolean = True): string; var strChineseTemp : string; cTemp : Char; begin result := ''; strChineseTemp := strChinese; while strChineseTemp<>'' do begin cTemp := GetPYIndexChar(strChineseTemp); if not bUpCase then begin // 转换为小写 cTemp := Chr(Ord(cTemp)+32); end; result := result + string(cTemp); strChineseTemp := Copy(strChineseTemp,3,Length(strChineseTemp)); end; end;end.
一级汉字如楼上 xzhifei 的方法,二级汉字用查表法,自己建个表就可以了
/*--获得汉字字符串的首字母--*/ if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fGetPy]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[fGetPy] GO--创建取拼音函数 create function fGetPy(@Str varchar(500)='') returns varchar(500) as begin declare @strlen int,@return varchar(500),@ii int declare @n int,@c char(1),@chn nchar(1)select @strlen=len(@str),@return='',@ii=0 set @ii=0 while @ii<@strlen begin select @ii=@ii+1,@n=63,@chn=substring(@str,@ii,1) if @chn>'z' select @n = @n +1 ,@c = case chn when @chn then char(@n) else @c end from( select top 27 * from ( select chn = '吖' union all select '八' union all select '嚓' union all select '咑' union all select '妸' union all select '发' union all select '旮' union all select '铪' union all select '丌' --because have no 'i' union all select '丌' union all select '咔' union all select '垃' union all select '嘸' union all select '拏' union all select '噢' union all select '妑' union all select '七' union all select '呥' union all select '仨' union all select '他' union all select '屲' --no 'u' union all select '屲' --no 'v' union all select '屲' union all select '夕' union all select '丫' union all select '帀' union all select @chn) as a order by chn COLLATE Chinese_PRC_CI_AS ) as b else set @c='a' set @return=@return+@c end return(@return) endgo --测试 select dbo.fgetpy('魏保光') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人 select dbo.fgetpy('刘子良') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人 select dbo.fgetpy('吴过') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人 select dbo.fgetpy('东北') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人--删除拼音函数 drop function fgetpy
// FileName: PY.pas
//
// Copyright (C) 1999 By Zhang Qing
//
// You can use and modify it ,but please send me an email.
//
// E-Mail: [email protected]
/////////////////////////////////////////////////////////////////////////////
unit PY;interface
uses sysutils;// 获取汉字的拼音首字符,这个函数将用在GetPYIndexStr 中.
function GetPYIndexChar(strChinese: string; bUpCase: Boolean = True): char;// 获取多个汉字的拼音首字符组成的字符串.
function GetPYIndexStr(strChinese: string; bUpCase: Boolean = True): string;implementation////////////////////////////////////////////////////////////////////////////
// 函数: GetPYIndexChar(strChinese: string;bUpCase: Boolean = True): char;
//
// 函数功能:获取汉字的拼音首字符.
// 例: GetPYIndexChar('程') 将返回'C'.
//
// 注意:对于多于一个汉字的输入(string类型)只有第一个有效,但不会产生错误
// 例如,GetPYIndexChar('程序')也将返回'C'.
//
// 第二个参数决定返回大写还是小写 , 缺省为大写 .
////////////////////////////////////////////////////////////////////////////
function GetPYIndexChar(strChinese: string;bUpCase: Boolean = True): char;
begin
// 根据汉字表中拼音首字符分别为“A”至“Z”的汉字内码范围,
// 要检索的汉字只需要检查它的内码位于哪一个首字符的范围内,
// 就可以判断出它的拼音首字符。
case WORD(strChinese[1]) shl 8 + WORD(strChinese[2]) of
$B0A1..$B0C4 : result := 'A';
$B0C5..$B2C0 : result := 'B';
$B2C1..$B4ED : result := 'C';
$B4EE..$B6E9 : result := 'D';
$B6EA..$B7A1 : result := 'E';
$B7A2..$B8C0 : result := 'F';
$B8C1..$B9FD : result := 'G';
$B9FE..$BBF6 : result := 'H';
$BBF7..$BFA5 : result := 'J';
$BFA6..$C0AB : result := 'K';
$C0AC..$C2E7 : result := 'L';
$C2E8..$C4C2 : result := 'M';
$C4C3..$C5B5 : result := 'N';
$C5B6..$C5BD : result := 'O';
$C5BE..$C6D9 : result := 'P';
$C6DA..$C8BA : result := 'Q';
$C8BB..$C8F5 : result := 'R';
$C8F6..$CBF9 : result := 'S';
$CBFA..$CDD9 : result := 'T';
$CDDA..$CEF3 : result := 'W';
$CEF4..$D188 : result := 'X';
$D1B9..$D4D0 : result := 'Y';
$D4D1..$D7F9 : result := 'Z';
else
result := char(0);
end;
if not bUpCase then
begin // 转换为小写
result := Chr(Ord(result)+32);
end;
end;////////////////////////////////////////////////////////////////////////////
// 函数: GetPYIndexStr(strChinese: string;bUpCase: Boolean = True): string;
//
// 函数功能:获取多个汉字的拼音首字符组成的字符串.
// 例: GetPYIndexStr('程') 将返回'C'.
// GetPYIndexStr('程序')将返回'CX'.
//
// 第二个参数决定返回大写还是小写 , 缺省为大写 .
////////////////////////////////////////////////////////////////////////////
function GetPYIndexStr(strChinese: string;bUpCase: Boolean = True): string;
var
strChineseTemp : string;
cTemp : Char;
begin
result := '';
strChineseTemp := strChinese;
while strChineseTemp<>'' do
begin
cTemp := GetPYIndexChar(strChineseTemp);
if not bUpCase then
begin // 转换为小写
cTemp := Chr(Ord(cTemp)+32);
end;
result := result + string(cTemp);
strChineseTemp := Copy(strChineseTemp,3,Length(strChineseTemp));
end;
end;end.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fGetPy]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[fGetPy]
GO--创建取拼音函数
create function fGetPy(@Str varchar(500)='')
returns varchar(500)
as
begin
declare @strlen int,@return varchar(500),@ii int
declare @n int,@c char(1),@chn nchar(1)select @strlen=len(@str),@return='',@ii=0
set @ii=0
while @ii<@strlen
begin
select @ii=@ii+1,@n=63,@chn=substring(@str,@ii,1)
if @chn>'z'
select @n = @n +1
,@c = case chn when @chn then char(@n) else @c end
from(
select top 27 * from (
select chn = '吖'
union all select '八'
union all select '嚓'
union all select '咑'
union all select '妸'
union all select '发'
union all select '旮'
union all select '铪'
union all select '丌' --because have no 'i'
union all select '丌'
union all select '咔'
union all select '垃'
union all select '嘸'
union all select '拏'
union all select '噢'
union all select '妑'
union all select '七'
union all select '呥'
union all select '仨'
union all select '他'
union all select '屲' --no 'u'
union all select '屲' --no 'v'
union all select '屲'
union all select '夕'
union all select '丫'
union all select '帀'
union all select @chn) as a
order by chn COLLATE Chinese_PRC_CI_AS
) as b
else set @c='a'
set @return=@return+@c
end
return(@return)
endgo
--测试
select dbo.fgetpy('魏保光') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人
select dbo.fgetpy('刘子良') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人
select dbo.fgetpy('吴过') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人
select dbo.fgetpy('东北') as 姓名拼音,dbo.fgetpy('ab中c国人') as 中国人--删除拼音函数
drop function fgetpy