使用localeCompare对数组进行排序,在IE和FF下,对中文的排序是根据拼音来着,而且效果很不错
至少“窦”字和“豆”字也能正确排序(GBK编码是按照拼音排的,但是窦字排在很后面)
查看了GB18030、UTF-8、BIG5、GB2312
这些编码都是按照部首来排的
那IE和FF使用localeCompare到底是根据什么编码来排的呢??

解决方案 »

  1.   

    你没用过charmap这个系统内置工具吗.
    看看里面的汉字集就知道了.IE,FF可没闲工夫另外专整一套,不过如此而已.
      

  2.   

    说错了,看CHARMAP还真容易反倒产生误解,里面是按部首排的,但其实你仔细看,表面上相邻的两个汉字的编码,却不是相邻的.汉字的编码,还是按照拼音排的.至于其它有些编码标准,则如早期的区位码一样,是按部首.这都是较早期的标准.
      

  3.   

    我前天花了半天特地去看了GB18030、UTF-8、GB2312、BIG5、GBK等常用汉字编码的,除了GBK外,其余都是按部首来排序的(GBK后面那些字估计是后来加的,所以无法按照拼音来排序了)
    拼音汉字集??
    能给个链接吗??
    我现在的想法是,自己弄个2个数组来存放UTF-8里的汉字集...
    例如下面的
    var a = [];
    a[11095] = 10;
    a[15433] = 5;
    // 没有读音的(比如偏旁部首),就统一用zzzzz5来代替,汉字拼音中,最多个应该就5个字母吧??(zhong)
    // 或者就干脆返回对应的十进制utf-8编码
    var b = ['zzzzz4','han','han1','han2','han3','han4','zi','zi1','zi2','zi3','zi4'];
    var str = 'sdkfj汉字kjsdf';
    str = str.replace(/[^\x30-\x80]/g, function($0) {
      return b[a[parseInt(escape($0).substring(2), 16) - 12288]];
    });
    alert(str);数组A对应utf-8里,从\u3000开始的汉字,如果是没有读音的,就对应b数组中的0,如果是有读音的,则对应b数组中,相应的读音所对应的下标,数据先检测是否带有汉字(是否在\u30-\u80区),如果有带汉字,则把汉字转换成相应的utf-8编码,然后再转为10进制,再减去12288(utf-8中,第一个汉字是从\u3000开始的)
    不过要把utf-8里的汉字都收录的话,也是个大工程啊,而且弄出来,估计js文件应该都有1M左右了...
      

  4.   

    BTW,上面说我花半天去找GB18030等编码,倒不是说研究很久怎么样,而是...我搜索半天没找到官方网站,或者是有权威一点的,可以下载到完整编码(支持搜索)的网站...
    utf-8倒是一下就找到了...
      

  5.   

    GB2312 最早的国标字库,内分为一级字库(按拼音排序)和二级字库(按部首排序)
    GBK 在 GB2312 基础上扩展,包容了 BIG5(台湾的大五码)
    GBK 的国际标准(unicode)是 CP936(又称 UCS-2),仅编码不同,排列顺序是一样的
    UTF-8(属另一套国际标准) 与 unicode 的码值间存在简单的数学关系 
    GB18030 是在 GBK 上的又一扩展,由于技术上的原因,目前新扩展的部分尚不能被现行的操作系统支持
      

  6.   

    后来试验了一下普通的排序,还真是惨不忍睹.
    localeCompare是使用用户机器设置的区域排序规则来进行排序.而我们平时在操作系统的资源管理器里,如果选择"按名称排序",就会看到,是按拼音排序的,至于豆窦什么的排序先后,在这里也都是比较符合正常认识的.虽然没看到有什么确定资料,但我可以十成把握地猜测localeCompare调用的排序规则,就是这个.
    就象空气一样,天天用已经习以为常,但真去思考,却还真有问题.比如这个排序规则,具体的数据表在哪,如何方便地调用(那样就不用再查自己建的拼音字库了),这些仍是有疑问的.
    希望其他有兴趣有时间的朋友关注一下吧.
      

  7.   

    更正,我还以为unicode 5.2中,汉字是从\u3000开始,刚看了下,是从\u3400开始...
      

  8.   

    事实证明你是对的
    “控制面板”-->“区域和语言设置”-->“区域选项”中“自定义”-->“排序”-->“拼音”(XP中为发音)
    我把它换成“笔划”后,再对本来可以正常调用localeCompare的表格进行排序,结果就是按笔划排序了
      

  9.   

    不知道有没有Linux桌面用户(我虚拟机里装的都只有控制台,没桌面)
    试试看FF在Linux下使用localeCompare的拼音排序在Linux下是否同样有效呢??在Win下(区域设置中,排序为“拼音”),IE和FF都可以正常排序的示例代码
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" language="javascript">
    function cusSort(th, order){
      order = typeof order !== "undefined" ? order : 1;
      var tb = th.parentNode.parentNode.parentNode.tBodies[0];
      var arr = [];
      for(var i=0; i<tb.rows.length; i++) {
        var cell = tb.rows[i].cells[th.cellIndex];
        var txt = "";
        for(var n = cell.firstChild; n !== null; n.nextSibling) {
          if(n.nodeType === 3) {
            txt = document.all ? n.nodeValue : n.nodeValue.replace(/^\\n*|^\s*|\s*$|\\n*$/g, "");
            break;
          }
        }
        arr.push([txt, tb.rows[i].rowIndex]);
      }
      arr.sort(function(a, b) { return a[0].localeCompare(b[0]); });
      var ntab = tb.parentNode.cloneNode(true);
      while(tb.rows.length > 0) tb.deleteRow(0);
      if(order) {
        // 如果不使用cloneNode,添加行到旧表格时,对应的ntab中的行就消失了...Orz
        for(var i=(arr.length-1); i>=0; i--) tb.appendChild(ntab.rows[arr[i][1]].cloneNode(true));
      } else {
        for(var i=0; i<arr.length; i++) tb.appendChild(ntab.rows[arr[i][1]].cloneNode(true));
      }
      th.onclick = function() { cusSort(this, !order) };
    }
    </script>
    </head>
    <body>
      <table id="tab" border="1">
        <thead>
          <tr>
            <th>ID</th>
            <th onclick="cusSort(this)">NAME</th>
            <th>CLASS</th>
            <th>HOME</th>
            <th>DESC</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>01</td>
            <td>
              JIRO        </td>
            <td>A3-5</td>
            <td>士大夫棵</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>02</td>
            <td>潘生</td>
            <td>A3-5</td>
            <td>士大夫棵</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>03</td>
            <td>戴生</td>
            <td>A3-5</td>
            <td>士大夫棵</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>04</td>
            <td>
              肖生
            </td>
            <td>A3-5</td>
            <td>士大夫棵</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>05</td>
            <td>蔡国柱</td>
            <td>A3-5</td>
            <td>士大夫棵</td>
            <td>&nbsp;</td>
          </tr>
          <tr>
            <td>06</td>
            <td>欧阳兆年</td>
            <td>A3-5</td>
            <td>士大夫棵</td>
            <td>&nbsp;</td>
          </tr>
        </tbody>
      </table>
    </body>
    </html>