42 votes

Comment comparer des chaînes Unicode en Javascript?

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.

37voto

Oriol Points 20803

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.

19voto

Mic Points 13418

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

13voto

Pekka 웃 Points 249607

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.

9voto

Tomasz Wysocki Points 4392

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]");
 

0voto

Silkster Points 1096

Le code pour Ł est 321 Le code pour Z est 90

321> 90 = vrai

"L" est 76 alors peut-être avez-vous une faute de frappe?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X