网上找到一个好方法,又小又简单又快,支持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;
}

解决方案 »

  1.   

    iwebsms(网信通) :
    这个其实就是用的汉字的编码来实现的,你这样的函数只能实现一级汉字
    对二级汉字就无法用了。不是的!支持gbk!我找过太多方法了,这种方法可以把许多怪异文字正确得到字母!
    还有一种方法很罗嗦,把2万多汉字的拼音列了个表,光这个函数就超过2k了。所有方法都没法解决的问题:重音字!
      

  2.   

    楼上:
    unicode的Char值是按照拼音排列的?怎么获取Char值?我试一下。
      

  3.   

    char ch = "我";
    Console.WriteLine( (int) ch );
      

  4.   

    char ch = '我';
    Console.WriteLine( (int) ch );
      

  5.   

    按楼上方法测试,没有规律阿!鼕笗戙墥凍倲働鶇動勭駧鯟鮗霘硐 (发音都是: dong)
    40725, 31511, 25113, 22693, 20941, 20530, 20685, 40327, 21205, 21229, 39399, 39903, 39831, 38680, 30800, 中国人进解放军万岁
    20013, 22269, 20154, 36827, 35299, 25918, 20891, 19975, 23681,
      

  6.   

    记得以前 vb.net 的字符串比较函数可以用额外参数指定字典排序规则,不知道.net 2.0的CompareTo函数有新的改进。不过,还是在比较字符时显式指定字典规则比较好,这样不用寄希望于巧合。
      

  7.   

    嗯……的确不是简单的按照char的值排的,与当前线程的区域语言有关……
      

  8.   

    已经有定论了啊,这和区域语言有关。每个字符都有一个区域语言值,这和ASCII及unicode值无关,这是根据当地语言相对于英语的排列顺序来决定的。如:
    奇怪->qg
    奇妙->qm则奇妙(qm)比奇怪(qg)大,搞怪在后面,这可以在操作系统中体现出来,楼主可以在操作系统中建这样的两个文件(夹)来实验一下,以名称排序。然后再把"奇怪"改成"奇异(qy)",再刷新就可以看到系统已经按照拼音顺序排好了
      

  9.   

    if(str.CompareTo("八")<0) return "A";
    if(str.CompareTo("嚓")<0) return "B";八的拼音是ba,以b开头的首个字符,小于它的自然是A
    嚓的拼音是ca,……
      

  10.   

    kssys() ( ) :
    "已经有定论了啊,这和区域语言有关。每个字符都有一个区域语言值... ..."看来有门了,怎么得到这个区域语言值呢,好像挺有用的。
    不见棺材不掉泪!
      

  11.   

    我刚刚查了,好像是extern的,也就是说是用native代码实现的,而这个表应该是Windows自带的,也就是代码页转换表。
      

  12.   

    LZ那个运行效率太低了...这个比LZ要快7~倍
     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;
            }
      

  13.   

    楼上:
    你哪个方法支持的文字太少,比如:鼕笗戙墥凍倲働鶇動勭駧鯟鮗霘硐(都是dong)就查不到。