网上找到一个好方法,又小又简单又快,支持gbk,不过原理不明白!不清楚CompareTo比较的是unicode编码还是gbk编码,查了字典发现这两种编码都不是按照拼音排列的,那他是怎么实现的呢? //根据根据测字拼音排序得到首字母
private static string GetGbkX(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;
}
private static string GetGbkX(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;
}
这个其实就是用的汉字的编码来实现的,你这样的函数只能实现一级汉字
对二级汉字就无法用了。不是的!支持gbk!我找过太多方法了,这种方法可以把许多怪异文字正确得到字母!
还有一种方法很罗嗦,把2万多汉字的拼音列了个表,光这个函数就超过2k了。所有方法都没法解决的问题:重音字!
unicode的Char值是按照拼音排列的?怎么获取Char值?我试一下。
Console.WriteLine( (int) ch );
Console.WriteLine( (int) ch );
40725, 31511, 25113, 22693, 20941, 20530, 20685, 40327, 21205, 21229, 39399, 39903, 39831, 38680, 30800, 中国人进解放军万岁
20013, 22269, 20154, 36827, 35299, 25918, 20891, 19975, 23681,
奇怪->qg
奇妙->qm则奇妙(qm)比奇怪(qg)大,搞怪在后面,这可以在操作系统中体现出来,楼主可以在操作系统中建这样的两个文件(夹)来实验一下,以名称排序。然后再把"奇怪"改成"奇异(qy)",再刷新就可以看到系统已经按照拼音顺序排好了
if(str.CompareTo("嚓")<0) return "B";八的拼音是ba,以b开头的首个字符,小于它的自然是A
嚓的拼音是ca,……
"已经有定论了啊,这和区域语言有关。每个字符都有一个区域语言值... ..."看来有门了,怎么得到这个区域语言值呢,好像挺有用的。
不见棺材不掉泪!
public static string getSpell(string cnChar)
{
byte[] arrCN = Encoding.Default.GetBytes(cnChar);
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 Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
}
}
return "*";
}
else return cnChar;
}
你哪个方法支持的文字太少,比如:鼕笗戙墥凍倲働鶇動勭駧鯟鮗霘硐(都是dong)就查不到。