使用localeCompare在Javascript中使用拼音进行中文排序?

时间:2014-04-07 08:32:08

标签: javascript sorting

我在这面临着相当大的挑战。我要排序某些中文"表达式"由拼音。

问题:
我怎么能在Firefox中按拼音排序?
有没有办法在IE 9和10中正确排序? (它们也得到网站的支持)

示例:

  1. 财经传讯公司
  2. 财经顾问
  3. 房地产及按揭
  4. 根据翻译机构的说法,这就是单词的排序顺序。翻译如下:

    1. 财务通讯机构
    2. 财务顾问
    3. 房地产和抵押贷款
    4. 拉丁字母表中的代词:

      1. cai jing chuan xun gong si
      2. cai jing gu wen
      3. fang di chan ji an jie
      4. String.localeCompare: MDN Docs

        根据我的理解,我将为String.localeCompare方法提供第二个参数,"告诉"按照BCP 47格式拼音排序的方法应为zh-CN-u-co-pinyin

        所以完整代码应如下所示:

        var arr = [ "财经传讯公司", "财经顾问", "房地产及按揭"];
        console.dir(arr.sort(function(a, b){
            return a.localeCompare(b, [ "zh-CN-u-co-pinyin" ]); 
        }));
        

        jsFiddle working example

        我希望这能按照我在数组中输入的顺序登录控制表达式,但输出不同。

        在FX 27上,订单为:3,1,2 在Chrome 33:1,2,3中 在IE 11:1,2,3中

        注意:

          拼音是用于抄写普通话的官方语音系统   汉字的发音为拉丁字母。

4 个答案:

答案 0 :(得分:4)

适用于Chrome:

const arr = ["博","啊","吃","世","中","超"]
arr.sort((x,y)=>x.localeCompare(y, 'zh-CN'))

答案 1 :(得分:1)

一般来说,人们会使用以下方法进行汉字拼音排序

var list=[' king ', 'a', 'li'];  
list.Sort(function (a, b) {return a.localeCompare(b); });

localeCompare():使用本地特定顺序来比较两个字符串。

这种拼音排序方法不可靠。

第二种方式:非常依赖中文操作系统

非常依赖于浏览器内核,也就是说,如果您的网站访问者是通过中文系统或Internet浏览器浏览器(Chrome),那么他可能无法看到拼音排序我们预期的结果。

这里我将介绍我对这个问题的解决方案,希望能够以某种方式推导出来: 此方法支持Unicode字符集x4e00从0到0 x9fa5区域共有20902个连续来自中国(包括台湾),日本,韩国,汉字,即CJK(中文日文朝鲜语)字符。

var CompareStrings={.........}
getOrderedUnicode: function (char) {
var originalUnicode=char.charCodeAt (); 
if (originalUnicode >=0 x4e00 && originalUnicode <=0 x9fa5) {
var index=this.Db.IndexOf (char); 
if (index >1) {
return index + 0 x4e00; 

}} 
return originalUnicode; 
}, 


compare: function (a, b) {
if (a==b) {return 0; }

//here can be rewritten according to the specific needs and the writing is the empty string at the bottom the if (a.length==0) {return 1; } 

if (b.length==0) {return - 1; } 
var count=a.length >B.length? B.length: a.length; 

for (var i=0; i<count; i++) {
var au=this.GetOrderedUnicode (a [i]); 
var bu=this.GetOrderedUnicode [i] (b); 
if (au >bu) {
return 1; 
} else if (au <bu) {
return - 1; 
}} 

return a.length >B.length? 1:1; 

}} 
//rewriting system native localeCompare 

原型:

LocaleCompare = function (param) {
    return CompareStrings.compare said (enclosing the toString (), param); 
} 

您可以通过以下链接下载complete code

简要介绍实施原则:

  1. 根据拼音排序好字符(db):有多种方法可以实现目标,我用JavaScript + c#组合完成,先用脚本先把所有枚举的汉字,然后提交给c #good背景排序,并输出到前台,这只是准备,什么都可以。

  2. 识别两个较大的字符(getOrderedUnicode):因为在订购时,不仅要处理中文字符,还要处理汉字以外的字符,所以比较器必须能够识别所有字符,我们这里通过判断一个字符是否要区分汉字:如果是汉字,那么排序好的字库搜索索引,索引值加上Unicode字符设置的第一个汉字的位置,是经过“校准”后的索引值的Unicode字符集;如果不是中文字符,则直接将其返回到Unicode字符集的索引值。

  3. 比较两个字符串(比较):通过比较两个字符(在有效范围比较中,即字符串的长度越短),如果找到大于b的字符,则返回1 ,副返回1.

  4. 在比较后的有效范围内如果没有平局,只要看看谁更长,例如a ='123',b ='1234',那么长b在后面排。

  5. 修改

    您也可以使用JQuery插件:

    jQuery.extend( jQuery.fn.dataTableExt.oSort, {
        "chinese-string-asc" : function (s1, s2) {
            return s1.localeCompare(s2);
        },
        "chinese-string-desc" : function (s1, s2) {
            return s2.localeCompare(s1);
        }
    } );
    

    请参阅original post

答案 2 :(得分:1)

根据MDN,{29}中添加了locales options localeCompare()个参数。您现在可以按拼音排序。

答案 3 :(得分:0)

这是一个解决方案:

<!--
pinyin_dict_notone.js and pinyinUtil.js is available in URL below:
https://github.com/sxei/pinyinjs
-->
<script src="pinyin_dict_notone.js"></script>
<script src="pinyinUtil.js"></script>
<script>
jQuery.extend(jQuery.fn.dataTableExt.oSort, {
  "chinese-string-asc": function(s1, s2) {
    s1 = pinyinUtil.getPinyin(s1);
    s2 = pinyinUtil.getPinyin(s2);
    return s1.localeCompare(s2);
  },
  "chinese-string-desc": function(s1, s2) {
    s1 = pinyinUtil.getPinyin(s1);
    s2 = pinyinUtil.getPinyin(s2);
    return s2.localeCompare(s1);
  }
});
jQuery(document).ready(function() {
  jQuery('#mydatatable').dataTable({
    "columnDefs": [
      { type: 'chinese-string', targets: 0 }
    ]
  });
});
</script>