2010-09-02 5 views
35

Lorsque j'ai écrit en JavaScript "Ł" > "Z" il renvoie true. Dans l'ordre Unicode, il devrait être bien sûr false. Comment régler ceci? Mon site utilise UTF-8.Comment comparer les chaînes Unicode en Javascript?

+0

Que voulez-vous faire exactement? Peut-être qu'il y a des solutions de contournement. –

+0

J'essaye de trier la table basée sur des noms d'utilisateur et j'ai des lettres comme "Ł". –

+0

En d'autres termes, il doit venir juste après 'L'? C'est à dire. '..J, K, L, £, M, N, O..'? – BalusC

Répondre

13

Vous pourriez être en mesure de créer votre propre fonction de tri en utilisant localeCompare() qui - au moins selon le MDC article on the topic - devrait trier les choses correctement.

Si cela ne fonctionne pas, voici un interesting SO question où l'OP utilise un remplacement de chaîne pour construire un mécanisme de tri «force brute».

Egalement dans cette question, l'OP montre comment construire a custom textExtract function pour le plugin jQuery tablesorter qui fait le tri des paramètres régionaux - peut-être aussi un coup d'oeil.

Edit: En tout far-out idée - Je ne sais pas si cela est faisable à tous, en particulier à cause des problèmes de performance - si vous travaillez avec PHP/mySQL sur le back-end de toute façon, je le ferais tiens à mentionner la possibilité d'envoyer une requête Ajax à une instance mySQL pour la faire trier. mySQL est idéal pour trier les données sensibles aux paramètres régionaux, car vous pouvez forcer les opérations de tri dans un classement spécifique en utilisant, par exemple, ORDER BY xyz COLLATE utf8_polish_ci, COLLATE utf8_german_ci .... ces classements prendraient soin de tous les malheurs de tri à la fois.

+0

Thx. pour les liens. Il est peu honteux que JavaScript ne le supporte pas dans le noyau, mais c'est toujours la solution de travail. –

+1

Soyez prudent avec 'localeCompare()' dans IE6: http://blog.schmichael.com/2008/07/14/javascript-collation-fail/ – BalusC

+0

@BalusC les commentaires dans cette affirmation de l'article qu'il est dans la faute de vin fait, pas IE6. Je ne trouve rien d'autre sur le sujet pour le confirmer ou le réfuter, et je suis trop paresseux pour construire un test en ce moment ... @Tomasz si vous suivez cette route, il serait intéressant d'entendre si les choses fonctionnent bien dans IE6. –

18

Voici un exemple pour l'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') 
); 

Ajouter 1 ou -1 comme le second paramètre de alpha() pour trier par ordre croissant ou décroissant.
Ajoutez true comme troisième paramètre pour trier les majuscules.

Vous devrez peut-être ajouter des numéros et des caractères spéciaux à la liste alphabétique

+0

Si vous utilisez ce code, voyez aussi: http://stackoverflow.com/questions/3630645/how-to-compare-utf-8-strings-in-javascript/3633725#3633725 –

+0

Eek! Est-ce que tu dois vraiment traverser tout ça? Qu'en est-il de l'oublier pour le mettre dans le formulaire de normalisation D en premier? Est-ce que PHP n'a vraiment rien d'équivalent à Perl [Unicode :: Collate] (http://search.cpan.org/perldoc?Unicode%3A%3ACollate) et [Unicode :: Collate :: Locale] (http: // search. cpan.org/perldoc?Unicode%3A%3ACollate%3A%3ALocale) modules? ** VRAIMENT? ** Cela ressemble à une folie absolue d'essayer de réimplémenter tout ça par soi-même! – tchrist

+2

@tchrist, ce n'est pas PHP, mais javascript ici, et c'est comme ça. – Mic

9

le code de Mic 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]"); 
-1

drôle, je dois penser à ce problème et a terminé la recherche ici , parce qu'il est venu à l'esprit, que je peux utiliser mon propre module javascript. J'ai écrit un module pour générer une URL propre, à cet effet, je dois translitate la chaîne d'entrée ... (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" 

Maintenant, vous pouvez trier avec ce résultat. Vous pouvez ex. stocker le titre original dans le champ "titre" et le champ pour le tri dans "title_sort" avec le résultat de mySlug.

+2

C'est presque une bonne solution. Le problème est que "ä" sera mélangé avec "a", mais devrait être séparé. –

Questions connexes