我在这面临着相当大的挑战。我要排序某些中文"表达式"由拼音。
问题:
我怎么能在Firefox中按拼音排序?
有没有办法在IE 9和10中正确排序? (它们也得到网站的支持)
示例:
根据翻译机构的说法,这就是单词的排序顺序。翻译如下:
拉丁字母表中的代词:
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" ]);
}));
我希望这能按照我在数组中输入的顺序登录控制表达式,但输出不同。
在FX 27上,订单为:3,1,2 在Chrome 33:1,2,3中 在IE 11:1,2,3中
注意:
拼音是用于抄写普通话的官方语音系统 汉字的发音为拉丁字母。
答案 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
简要介绍实施原则:
根据拼音排序好字符(db):有多种方法可以实现目标,我用JavaScript + c#组合完成,先用脚本先把所有枚举的汉字,然后提交给c #good背景排序,并输出到前台,这只是准备,什么都可以。
识别两个较大的字符(getOrderedUnicode):因为在订购时,不仅要处理中文字符,还要处理汉字以外的字符,所以比较器必须能够识别所有字符,我们这里通过判断一个字符是否要区分汉字:如果是汉字,那么排序好的字库搜索索引,索引值加上Unicode字符设置的第一个汉字的位置,是经过“校准”后的索引值的Unicode字符集;如果不是中文字符,则直接将其返回到Unicode字符集的索引值。
比较两个字符串(比较):通过比较两个字符(在有效范围比较中,即字符串的长度越短),如果找到大于b的字符,则返回1 ,副返回1.
在比较后的有效范围内如果没有平局,只要看看谁更长,例如a ='123',b ='1234',那么长b在后面排。
修改强>
您也可以使用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>