Lorsque j'ai écrit en JavaScript "Ł" > "Z"
il renvoie true
. Dans l'ordre Unicode, il doit bien sûr être false
. Comment régler ceci? Mon site utilise UTF-8.
Réponses
Trop de publicités?Vous pouvez utiliser Intl.Collator
ou String.prototype.localeCompare
, introduit par l' ECMAScript l'Internationalisation de l'API:
"Ł".localeCompare("Z", "pl"); // -1
new Intl.Collator("pl").compare("Ł","Z"); // -1
-1
signifie qu' Ł
"vient avant" Z
, comme vous voulez.
Remarque: il ne fonctionne que sur les navigateurs récents, cependant.
Voici un exemple d'alphabet français qui pourrait vous aider pour un tri personnalisé:
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;
};
};
Pour l'utiliser sur un tableau de chaînes a
:
a.sort(
alpha('ABCDEFGHIJKLMNOPQRSTUVWXYZaàâäbcçdeéèêëfghiïîjklmnñoôöpqrstuûüvwxyÿz')
);
Ajoutez 1
ou -1
comme deuxième paramètre de alpha()
pour trier par ordre croissant ou décroissant.
Ajoutez true
comme troisième paramètre pour trier la casse.
Vous devrez peut-être ajouter des chiffres et des caractères spéciaux à la liste alphabétique
Vous pouvez être en mesure de construire votre propre fonction de tri à l'aide de localeCompare()
- au moins selon le MDC article sur le sujet - devrait arranger les choses correctement.
Si cela ne fonctionne pas, voici un intéressant DONC, la question où l'OP emploie chaîne de remplacement pour construire une "force brute" mécanisme de tri.
Aussi, dans cette question, l'OP montre comment construire une coutume textExtract
fonction pour le jQuery plugin tablesorter qui n'locale-courant tri - peut-être aussi en valeur un regard.
Edit: totalement loin de l'idée - je n'ai aucune idée si c'est faisable à tous, en particulier à cause de problèmes de performances - si vous travaillez avec PHP/mySQL sur le back-end de toute façon, je voudrais parler de la possibilité de l'envoi d'une requête Ajax à une instance mySQL pour avoir un tri là. mySQL est une excellente paramètres régionaux de tri conscient de données, parce que vous pouvez forcer les opérations de tri dans un classement spécifique à l'aide par exemple, ORDER BY xyz COLLATE utf8_polish_ci
, COLLATE utf8_german_ci
.... ces classements voudrais prendre soin de tous les tri malheurs à la fois.
Le code du micro a été amélioré pour les caractères non mentionnés:
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]");