C#将汉字转换为拼音首字母
关于这个话题以前曾经使用过一个简便的算法很长时间, 代码如下:
private string ToPinyinSingle(string str)
{
if (str.CompareTo("吖") < 0)
return str;
if (str.CompareTo("八") < 0)
return "a";
if (str.CompareTo("嚓") < 0)
return "b";
if (str.CompareTo("咑") < 0)
return "c";
if (str.CompareTo("妸") < 0)
return "d";
if (str.CompareTo("发") < 0)
return "e";
if (str.CompareTo("旮") < 0)
return "f";
if (str.CompareTo("铪") < 0)
return "g";
if (str.CompareTo("讥") < 0)
return "h";
if (str.CompareTo("咔") < 0)
return "j";
if (str.CompareTo("垃") < 0)
return "k";
if (str.CompareTo("嘸") < 0)
return "l";
if (str.CompareTo("拏") < 0)
return "m";
if (str.CompareTo("噢") < 0)
return "n";
if (str.CompareTo("妑") < 0)
return "o";
if (str.CompareTo("七") < 0)
return "p";
if (str.CompareTo("亽") < 0)
return "q";
if (str.CompareTo("仨") < 0)
return "r";
if (str.CompareTo("他") < 0)
return "s";
if (str.CompareTo("哇") < 0)
return "t";
if (str.CompareTo("夕") < 0)
return "w";
if (str.CompareTo("丫") < 0)
return "x";
if (str.CompareTo("帀") < 0)
return "y";
if (str.CompareTo("咗") < 0)
return "z";
return str;
}
这个函数只处理单个汉字, 简单地加个循环就可以让它处理文字串了.
在.net 3.5下, 它一直工作得很好, 虽然偶尔也有出错的时候, 但是概率极低, 基本上可以忽略不计.
然而后来我把项目升级到.net 4.0以后, 发现出错的几率直线上升, 已经高得无法容忍的程度了(例如, "梅" 会返回"L"), 简单查了一下, 没找到微软关于String.CompareTo函数有什么变化的说明, 束手无策, 于是换用另一个也很简单的算法(http://topic.csdn.net/u/20090219/12/61745e3a-a39e-4f4d-8985-67d124236694.html):
static public string getSpell(string cn)
{
byte[] arrCN = System.Text.Encoding.Default.GetBytes(cn);
if(arrCN.Length > 1)
{
int area = (short)arrCN[0];
int pos = (short)arrCN[1];
int code = (area<<8) + pos;
int[] areacode = {45217,45253,45761,46318,46826,47010,47297,47614,48119,48119,49062,49324,49896,50371,50614,50622,50906,51387,51446,52218,52698,52698,52698,52980,53689,54481};
for(int i=0;i<26;i++)
{
int max = 55290;
if(i != 25) max = areacode[i+1];
if(areacode[i]<=code && code<max)
{
return System.Text.Encoding.Default.GetString(new byte[]{(byte)(65+i)});
}
}
return "?";
}
else return cn;
}
但是这个函数出错的概率也很高, 例如"闫""窦""圳" 等都无法识别, 追查了一下原因, 发现原来对GB2312编码来说, 存放规定是这样的:
01-09区为特殊符号。
上述几个字位置码都大于55290, 显然是二级汉字, 这个算法就处理不了了, 换言之, 这种写法只能用于处理一级汉字. 这当然是不可接受的.
后来翻查良久, 终于找到一个用C++写的算法, 可以同时处理一级汉字和二级汉字(http://download.csdn.net/detail/ronjay/1955072), 我把它改写成了C#, 代码如下:
public class ChineseToPinYin
{
#region " 全局变量 "
private static string[] _regionChar = new string[32]
{
"CJWGNSPGCGNESYPBTYYZDXYKYGTDJNNJQMBSGZSCYJSYYQPGKBZGYCYWJKGKLJSWKPJQHYTWDDZLSGMRYPYWWCCKZNKYDG",
"TTNGJEYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJZXDTTSQZYCDXXHGCKBPHFFSSWYBGMXLPBYLLLHLX",
"SPZMYJHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZCDJZWQJBDZBXGZNZCPWHKXHQKMWFBPBY",
"DTJZZKQHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJJSDCSBBQBEFSJYHWWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBN",
"PTSDKDYLHGYMYLCXPYCJNDQJWXQXFYYFJLEJBZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQTRBCJTHZTQFRXQHXMJJCJLX",
"QGJMSHZKBSWYEMYLTXFSYDSGLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCL",
"QKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNMNYKLDYXZPWLGGTMTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZH",
"ZXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCS",
"YDBDLLSCDDNLKJYKJSYCJLKOHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPCJOQLCDHJJYSPRCHNWJNLHLYYQYYWZPTCZG",
"WWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYDCFCXYHLXCHYZJQSFQAGMNYXPFRKSSBJLYXY",
"SYGLNSCMHCWWMNZJJLXXHCHSYDSTTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLYSDCCWZOCWKCCSBNHCPDYZNFCYYTYCKX",
"KYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQHZPQSQSCFYMMDMGBWHWLGSSLYSDLMLXPTHMJ",
"HWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZPMGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCL",
"SLDCLRPBHZHXYYFHBBGDMYCNQQWLQHJJZYWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSLXHTZKZJECXJCJNMFBYCSFYWYB",
"JZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJXJYZGWK",
"YPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQQHZYJCZYDJWBMJKLDDPMJEGXYHYLXHLQYQHKYCW",
"CJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHHJLJAXFGFJZSLCFDQZ",
"LCLGJDJCSNCLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNW",
"CZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSB",
"GBMMCJSSCLPQPDXCDYYKYFCJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSS",
"LLYXQSXSBSJSBBSGGHFJLWPMZJNLYYWDQSHZXTYYWHMCYHYWDBXBTLMSYYYFSXJCSDXXLHJHFSSXZQHFZMZCZTQCXZXRTT",
"DJHNNYZQQMNQDMMGYYDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYN",
"SPRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJJGYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTTSSXTBNPDKLEYCJNYCDYKZDDHQH",
"SDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKR",
"ZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLGBDJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJS",
"CMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJYYCNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCGLZCSHLTOLJNMDDDLNGKAQHQH",
"JGYKHEZNMSHRPHQQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMM",
"MYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYJDJJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZKHHGFLBCSMDLDG",
"DZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYG",
"CTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZ",
"GSZZQJYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNDSZFDEQFHBS",
"AQTGLLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ"
};
private static System.Text.Encoding _encoding = System.Text.Encoding.GetEncoding("GB2312");
#endregion
private static bool In(int lp, int hp, int value)
{
return ((value <= hp) && (value >= lp));
}
public static char GetFirstChar(string chineseChar)
{
var bytes = _encoding.GetBytes(chineseChar);
if (bytes.Length != 2)
return chineseChar[0];
return GetChar(bytes[0], bytes[1], chineseChar);
}
private static char GetChar(byte c1, byte c2, string originChar)
{
var Hi = c1 << 8;
var Lo = c2;
int n = Hi + Lo;
if (n <= 0xD7F9)
{
if (In(0xB0A1, 0xB0C4, n)) return 'A';
if (In(0XB0C5, 0XB2C0, n)) return 'B';
if (In(0xB2C1, 0xB4ED, n)) return 'C';
if (In(0xB4EE, 0xB6E9, n)) return 'D';
if (In(0xB6EA, 0xB7A1, n)) return 'E';
if (In(0xB7A2, 0xB8C0, n)) return 'F';
if (In(0xB8C1, 0xB9FD, n)) return 'G';
if (In(0xB9FE, 0xBBF6, n)) return 'H';
if (In(0xBBF7, 0xBFA5, n)) return 'J';
if (In(0xBFA6, 0xC0AB, n)) return 'K';
if (In(0xC0AC, 0xC2E7, n)) return 'L';
if (In(0xC2E8, 0xC4C2, n)) return 'M';
if (In(0xC4C3, 0xC5B5, n)) return 'N';
if (In(0xC5B6, 0xC5BD, n)) return 'O';
if (In(0xC5BE, 0xC6D9, n)) return 'P';
if (In(0xC6D1, 0xC8BA, n)) return 'Q';
if (In(0xC8BB, 0xC8F5, n)) return 'R';
if (In(0xC8F6, 0xCBF9, n)) return 'S';
if (In(0xCBFA, 0xCDD9, n)) return 'T';
if (In(0xCDDA, 0xCEF3, n)) return 'W';
if (In(0xCEF4, 0xD1B8, n)) return 'X';
if (In(0xD1B9, 0xD4D0, n)) return 'Y';
if (In(0xD4D1, 0xD7F9, n)) return 'Z';
return originChar[0];
}
else
{
var b1 = (c1 & 0x7F) - 0x20 - 56;
var b2 = (c2 & 0x7F) - 0x20 - 1;
if (b1 >= 0 && b1 <= 31 && b2 >= 0 && b2 <= 93)
{
return _regionChar[b1][b2];
}
return originChar[0];
}
}
}
这个算法目前还没有发现哪个汉字会出错.
C#将汉字转换为拼音首字母相关推荐
- Excel2007将汉字转换为拼音首字母
Excel2007将汉字转换为拼音首字母 一.打开Excel,按下"Alt+F11"组合键,弹出"Visual Basic编辑器" 二.点击"Visu ...
- php繁体拼音字母,[UTF-8]汉字转换为拼音首字母pinyinFirstChar.fn.php
说明: 一个PHP函数,可以将UTF-8编码的汉字转换为拼音首字母,由GBK的汉字转拼音首字母的函数修改而来.只转换GBK编码内的汉字,标点.字母及GBK内没有的汉字将直接输出不转换. 用法: ech ...
- python将汉字转换为拼音首字母
在完成了<学生信息管理系统>后,一天我爸问我,为什么不能用学生姓名拼音首字母搜索,这样会方便不收.我也觉得在理,但是经过我一番搜索资料后,觉得直接在数据库中写函数太过于复杂,不如直接增加一 ...
- java汉字转换为拼音首字母
使用 pinyin4j 2.5.0.jar 进行解决.封装了一个工具类 package com.util;import net.sourceforge.pinyin4j.PinyinHelper; i ...
- 如何把汉字生成拼音首字母
文章目录 使用场景 实现方法 使用场景 希望把一段汉字,转换为拼音首字母,用于搜索等 实现方法 通过EXCEL的宏实现,打开EXCEL,文件→选项→自定义功能区→勾选开发工具 点击开发工具→Visua ...
- IOS汉字转拼音首字母
项目中需要给UITableView建右侧索引,需要获取汉字的拼音首字母,而汉字转拼音一般都是使用CFStringTransform方法 - (NSString*)pinyin {if (self == ...
- 汉字转换拼音首字母(可以处理部分多音字)
一.前言 汉字转拼音貌似一直是C#开发的一个难题,无论什么方案都有一定的bug,之前使用了两种方案. 1.Chinese2Spell.cs 一些不能识别的汉字全部转为Z 2.Microsoft Vis ...
- C# 汉字转拼音首字母大写
我们在手机上经常都能看到通过拼音缩写来搜索好友信息,那么它是如何将一段汉字转换为首字母大写呢 首先我们来了解一下中文在计算机中的结构.计算机识别的是字节,字节(Byte)是计算机信息技术用于计量存储容 ...
- 在PostgreSQL中实现按拼音、汉字、拼音首字母搜索的例子
在PostgreSQL中实现按拼音.汉字.拼音首字母搜索的例子 作者 digoal 日期 2016-11-09 标签 PostgreSQL , 拼音 , 中文分词 , tsvector , 拼音首字母 ...
最新文章
- 产品管理|产品设计流程[完整版]
- Windows Phone开发(29):隔离存储C 转:http://blog.csdn.net/tcjiaan/article/details/7447469...
- 分步表单_表单设计-掌握表单设计方法(表单体验篇)
- 父亲节重读朱自清先生的《背影》
- Android Task 相关
- 行为型设计模式(4)—— 观察者模式(Observer Pattern)
- wdcp 开启某个Mysql数据库远程访问
- 2021 年百度之星·程序设计大赛 - 初赛二 1002 随机题意
- JMeter Ramp-up 说明
- 饥荒控制台输入没用_饥荒联机版代码为什么没效 怎么用怎么输入
- 你和你的女神之间,差了一个OpenCV口红色号识别器
- C#体贴之处点滴 - extention method, lambda expression, anonymous method
- 2021普华集团数字经济年度盛典在三亚盛大举行
- 关于使用群晖系统创建音乐外链的研究
- PaddlePaddle笔记4-看图写诗
- 前端涨薪必读,node.js入门保姆级教程
- Linux环境下二进制安装PostgreSql
- 3ds Max 实验十一 材质的设置
- GPIO模块常用的一些方法
- 在Linux手机上编译和运行2048游戏学习C++
热门文章
- THead USB适配方案
- Linux那些事儿 之 戏说USB(22)设备的生命线(一)
- 独立于计算机系统的是 用户模式,第6章 数据库技术基础习题
- python提取pdf发票信息_PDF电子发票内容提取
- Python--使用jieba进行分词并计算词权重
- 文本挖掘(超详细:数据获取 - 数据清洗 - 中文分词 - 去除停用词 - 词频统计 - 词云图 - 情感分析)
- 螺旋节能灯和U型节能灯相比有哪些优点?
- 金蝶EAS,后台代码查询科目余额,SQL查询科目余额
- while和do—while循环语句
- 【算法之美】改变世界的十位算法大师