如何在Javascript中比较Unicodestring?
当我用JavaScript写"Ł" > "Z"
它返回true
。 按Unicode顺序,当然应该是false
。 如何解决这个问题? 我的网站正在使用UTF-8。
您可以使用由ECMAScript Internationalization API引入的Intl.Collator
或String.prototype.localeCompare
:
"Ł".localeCompare("Z", "pl"); // -1 new Intl.Collator("pl").compare("Ł","Z"); // -1
-1
表示Ł
在Z
之前,就像你想要的那样。
注意它只适用于最新的浏览器。
这是一个法国字母表的例子,可以帮助你自定义sorting:
var alpha = function(alphabet, dir, caseSensitive){ return function(a, b){ var pos = 0, min = Math.min(a.length, b.length); dir = dir || 1; caseSensitive = caseSensitive || false; if(!caseSensitive){ a = a.toLowerCase(); b = b.toLowerCase(); } while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; } return alphabet.indexOf(a.charAt(pos)) > alphabet.indexOf(b.charAt(pos)) ? dir:-dir; }; };
要在一个string数组上使用它:
a.sort( alpha('ABCDEFGHIJKLMNOPQRSTUVWXYZaàâäbcçdeéèêëfghiïîjklmnñoôöpqrstuûüvwxyÿz') );
加1
或-1
作为alpha()
的第二个参数来升序或降序sorting。
添加true
作为第三个参数来区分大小写。
您可能需要在字母表中添加数字和特殊字符
您可以使用localeCompare()
构build自己的sorting函数,至less根据MDC关于主题的文章,应该正确地sorting。
如果不行的话,这里有一个有趣的SO问题 ,在这个问题上,OP使用stringreplace来构build“powershell”sorting机制。
同样在这个问题中,OP展示了如何为jQuery tablesorter插件构build一个自定义的textExtract
函数 ,它可以进行区域感知sorting – 也许值得一看。
编辑:作为一个完全遥远的想法 – 我不知道这是否是可行的,尤其是因为性能方面的问题 – 如果您正在后端使用PHP / mySQL,我想提一下发送一个Ajax查询到一个mySQL实例,让它在那里sorting。 mySQL在sorting语言环境感知数据方面非常出色,因为您可以使用ORDER BY xyz COLLATE utf8_polish_ci
, COLLATE utf8_german_ci
….等强制sorting操作进行特定的sorting。这些sorting会同时处理所有的sorting问题。
麦克的代码改进了非提及的字符:
var alpha = function(alphabet, dir, caseSensitive){ dir = dir || 1; function compareLetters(a, b) { var ia = alphabet.indexOf(a); var ib = alphabet.indexOf(b); if(ia === -1 || ib === -1) { if(ib !== -1) return a > 'a'; if(ia !== -1) return 'a' > b; return a > b; } return ia > ib; } return function(a, b){ var pos = 0; var min = Math.min(a.length, b.length); caseSensitive = caseSensitive || false; if(!caseSensitive){ a = a.toLowerCase(); b = b.toLowerCase(); } while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; } return compareLetters(a.charAt(pos), b.charAt(pos)) ? dir:-dir; }; }; function assert(bCondition, sErrorMessage) { if (!bCondition) { throw new Error(sErrorMessage); } } assert(alpha("bac")("a", "b") === 1, "b is first than a"); assert(alpha("abc")("ac", "a") === 1, "shorter string is first than longer string"); assert(alpha("abc")("1abc", "0abc") === 1, "non-mentioned chars are compared as normal"); assert(alpha("abc")("0abc", "1abc") === -1, "non-mentioned chars are compared as normal [2]"); assert(alpha("abc")("0abc", "bbc") === -1, "non-mentioned chars are compared with mentioned chars in special way"); assert(alpha("abc")("zabc", "abc") === 1, "non-mentioned chars are compared with mentioned chars in special way [2]");
有趣的是,我不得不考虑这个问题,并在这里完成search,因为它记住了,我可以使用我自己的JavaScript模块。 我写了一个模块来生成一个干净的URL,因此我不得不翻译inputstring…( http://pid.github.io/speakingurl/ )
var mySlug = require('speakingurl').createSlug({ maintainCase: true, separator: " " }); var input = "Schöner Titel läßt grüßen!? Bel été !"; var result; slug = mySlug(input); console.log(result); // Output: "Schoener Titel laesst gruessen bel ete"
现在你可以对这个结果进行sorting。 你可以 将原始标题存储在“title”字段中,并在“title_sort”中存储用于mySlug结果的字段。