在編程中,我們經(jīng)常會遇到漢字助記碼的問題,筆者曾經(jīng)為此多次發(fā)愁,現(xiàn)總結(jié)前輩的好東西,記錄于此,希望能幫助到您,方法有多種,在此比較幾種方案,簡單剖析一下。
首先說明,什么是漢字助記碼?所謂的漢字助記碼就是一個漢字的拼音的首字母,如:張的漢字助記碼為Z,湖北中醫(yī)藥大學(xué)的助記碼為HBZYYDX。下面通過程序用三種方法實現(xiàn):
方法一:表獲取方法;
表內(nèi)容大致說明:
實現(xiàn)核心代碼——SQL標(biāo)量值函數(shù):
1 ------------------------------------------------ 2 --作者:zhangbc 3 --時間:2014-05-05 4 --功能:獲取漢字拼音首字母 5 ------------------------------------------------ 6 ALTER function [dbo].[fun_getMnemonic](@str nvarchar(4000)) 7 returns nvarchar(4000) 8 as 9 begin10 declare @zjm varchar(100),@tmp_char varchar(2),@tmp_zjm varchar(2), @i int,@length int11 set @zjm =''12 set @length = len(@str)13 set @i = 114 while @i<=@length 15 begin16 set @tmp_char = substring(@str,@i,1)17 select @tmp_zjm =zjm from hz_zjm where hanzi=@tmp_char18 if @@rowcount=1 19 set @zjm = @zjm +Rtrim(@tmp_zjm)20 set @i = @i + 1 21 end 22 return (@zjm)23 end
方法二:存儲過程獲取;
實現(xiàn)核心代碼——SQL存儲過程:
1 -- ============================================= 2 -- Author: zhangbc 3 -- Create date: 2014-05-03 4 -- Description: 獲取漢字拼音首字母 5 -- ============================================= 6 ALTER PROCEDURE [dbo].[getMnemonic] 7 @str varchar(4000) 8 AS 9 -- return char(4000)10 BEGIN11 declare @Word nchar(1),@PY nvarchar(4000) 12 set @PY='' 13 while len(@str)>0 14 begin 15 set @word=left(@str,1) 16 --如果非漢字字符,返回原字符 17 set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901 18 then (select top 1 PY from ( 19 select 'A' as PY,N'驁' as word 20 union all select 'B',N'簿' 21 union all select 'C',N'錯' 22 union all select 'D',N'鵽' 23 union all select 'E',N'樲' 24 union all select 'F',N'鰒' 25 union all select 'G',N'腂' 26 union all select 'H',N'夻' 27 union all select 'J',N'攈' 28 union all select 'K',N'穒' 29 union all select 'L',N'鱳' 30 union all select 'M',N'旀' 31 union all select 'N',N'桛' 32 union all select 'O',N'漚' 33 union all select 'P',N'曝' 34 union all select 'Q',N'囕' 35 union all select 'R',N'鶸' 36 union all select 'S',N'蜶' 37 union all select 'T',N'籜' 38 union all select 'W',N'鶩' 39 union all select 'X',N'鑂' 40 union all select 'Y',N'韻' 41 union all select 'Z',N'咗' 42 ) T 43 where word>=@word collate Chinese_PRC_CS_AS_KS_WS 44 order by PY ASC) else @word end) 45 set @str=right(@str,len(@str)-1) 46 end 47 select @PY 48 END
方法三:標(biāo)量值獲?。ㄋ惴ê头椒ǘ粯樱瑢崿F(xiàn)方式不同):
代碼如下:
1 ------------------------------------------------ 2 --作者:zhangbc 3 --時間:2014-03-19 4 --功能:獲取漢字拼音首字母 5 ------------------------------------------------ 6 ALTER function [dbo].[fun_getZjm](@str nvarchar(4000)) 7 returns nvarchar(4000) 8 as 9 begin 10 declare @word nchar(1),@PY nvarchar(4000) 11 set @PY='' 12 while len(@str)>0 13 begin 14 set @word=left(@str,1) 15 --如果非漢字字符,返回原字符 16 set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901 17 then (select top 1 PY from ( 18 select 'A' as PY,N'驁' as word 19 union all select 'B',N'簿' 20 union all select 'C',N'錯' 21 union all select 'D',N'鵽' 22 union all select 'E',N'樲' 23 union all select 'F',N'鰒' 24 union all select 'G',N'腂' 25 union all select 'H',N'夻' 26 union all select 'J',N'攈' 27 union all select 'K',N'穒' 28 union all select 'L',N'鱳' 29 union all select 'M',N'旀' 30 union all select 'N',N'桛' 31 union all select 'O',N'漚' 32 union all select 'P',N'曝' 33 union all select 'Q',N'囕' 34 union all select 'R',N'鶸' 35 union all select 'S',N'蜶' 36 union all select 'T',N'籜' 37 union all select 'W',N'鶩' 38 union all select 'X',N'鑂' 39 union all select 'Y',N'韻' 40 union all select 'Z',N'咗' 41 ) T 42 where word>=@word collate Chinese_PRC_CS_AS_KS_WS 43 order by PY ASC) else @word end) 44 set @str=right(@str,len(@str)-1) 45 end 46 return @PY 47 end
方法四:字符編碼法;
核心代碼如下:
1 public class getMnemonic 2 { 3 public getMnemonic() 4 { 5 6 } 7 /// <summary> 8 /// 字符編碼的獲取 9 /// </summary>10 /// <param name="cnChar">字符</param>11 /// <returns>字符編碼</returns>12 private static string getSpell(string cnChar)13 {14 byte[] arrCN = Encoding.Default.GetBytes(cnChar);15 if (arrCN.Length > 1)16 {17 int area = (short)arrCN[0];18 int pos = (short)arrCN[1];19 int code = (area << 8) + pos;20 int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 21 48119, 48119, 49062, 49324, 49896,50371, 50614, 50622,22 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };23 for (int i = 0; i < 26; i++)24 {25 int max = 55290;26 if (i != 25)27 max = areacode[i + 1];28 if (areacode[i] <= code && code < max)29 return Encoding.Default.GetString(new byte[] { (byte)(65 + i)});30 }31 return "*";32 }33 else return cnChar;34 }35 /// <summary>36 /// 字符編碼獲取助記碼37 /// </summary>38 /// <param name="str">漢字</param>39 /// <returns>助記碼</returns>40 public string getChsSpell(string str)41 {42 string myStr = "";43 for (int i = 0; i < str.Length; i++)44 {45 myStr += getSpell(str.Substring(i, 1));46 }47 return myStr;48 }49 }
測試結(jié)果如下:
圖1-1
圖1-2
圖1-3
圖1-4
小結(jié):
通過測試結(jié)果來看,字符編碼(方法四)還是有點不完美,其實通過表獲取的方法(方法一)也存在不足,漢字存儲太少。
這次測試的一個意外收獲就是char()與varchar()的區(qū)別,請看:
還望知情者給予合理的解釋,不甚感激!如果能給你帶來幫助,請贊一個,你的用心閱讀是我寫博的不竭動力!
贈送源碼一份,供您研究:http://files.VEVb.com/zhangbc/MnemonicOfWords.rar
PS:如有不足之處,歡迎指點與切磋,您的光臨是我的榮幸,聯(lián)系方式QQ:649414754
新聞熱點
疑難解答