汉字助记码,你会了吗?
2018-06-18 05:11:34来源:未知 阅读 ()
汉字助记码,你会了吗?
在编程中,我们经常会遇到汉字助记码的问题,笔者曾经为此多次发愁,现总结前辈的好东西,记录于此,希望能帮助到您,方法有多种,在此比较几种方案,简单剖析一下。
首先说明,什么是汉字助记码?所谓的汉字助记码就是一个汉字的拼音的首字母,如:张的汉字助记码为Z,湖北中医药大学的助记码为HBZYYDX。下面通过程序用三种方法实现:
方法一:表获取方法;
表内容大致说明:
实现核心代码——SQL标量值函数:
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 begin
10 declare @zjm varchar(100),@tmp_char varchar(2),@tmp_zjm varchar(2), @i int,@length int
11 set @zjm =''
12 set @length = len(@str)
13 set @i = 1
14 while @i<=@length
15 begin
16 set @tmp_char = substring(@str,@i,1)
17 select @tmp_zjm =zjm from hz_zjm where hanzi=@tmp_char
18 if @@rowcount=1
19 set @zjm = @zjm +Rtrim(@tmp_zjm)
20 set @i = @i + 1
21 end
22 return (@zjm)
23 end
方法二:存储过程获取;
实现核心代码——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 BEGIN
11 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
方法三:标量值获取(算法和方法二一样,实现方式不同):
代码如下:
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 }
测试结果如下:
图1-1
图1-2
图1-3
图1-4
小结:
通过测试结果来看,字符编码(方法四)还是有点不完美,其实通过表获取的方法(方法一)也存在不足,汉字存储太少。
这次测试的一个意外收获就是char()与varchar()的区别,请看:
还望知情者给予合理的解释,不甚感激!如果能给你带来帮助,请赞一个,你的用心阅读是我写博的不竭动力!
赠送源码一份,供您研究:http://files.cnblogs.com/zhangbc/MnemonicOfWords.rar
PS:如有不足之处,欢迎指点与切磋,您的光临是我的荣幸,联系方式QQ:649414754
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:让Ajax更简单
下一篇:ASP.NET刷新页面的六种方法
- 送java学习资料,学会了这些你就是大神 2020-03-08
- Nginx 热部署和日志切割,你学会了吗? 2019-11-02
- 学会了这些技术,你离BAT大厂不远了 2019-08-27
- Java一个汉字占几个字节(详解与原理)(转载) 2018-12-25
- Java-汉字繁体拼音转换 2018-10-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash