2010-09-02 8 views
35

Als ich in JavaScript schrieb "Ł" > "Z"true. In Unicode-Reihenfolge sollte es natürlich false sein. Wie behebe ich das? Meine Website verwendet UTF-8.Wie vergleicht man Unicode-Strings in Javascript?

+0

Was versuchst du genau zu machen? Vielleicht gibt es Workarounds. –

+0

Ich versuche die Tabelle nach Benutzernamen zu sortieren und habe Buchstaben wie "£". –

+0

Mit anderen Worten, es muss direkt nach "L" kommen? I.e. '..J, K, L, £, M, N, O..'? – BalusC

Antwort

13

Sie können möglicherweise Ihre eigene Sortierfunktion mit localeCompare() erstellen, die - zumindest nach der MDC article on the topic - Dinge richtig sortieren sollte.

Wenn das nicht funktioniert, ist hier ein interesting SO question, wo das OP String-Ersatz verwendet, um einen "Brute-Force" -Sortiermechanismus aufzubauen.

Auch in dieser Frage zeigt das OP, wie man a custom textExtract function für das jQuery-tablesorter-Plugin baut, das Gebietsschema-bewusste Sortierung macht - vielleicht auch einen Blick wert.

Edit: Als eine völlig ferne Idee - ich habe keine Ahnung, ob dies überhaupt machbar ist, vor allem wegen Performance-Bedenken - wenn Sie sowieso mit PHP/mySQL auf dem Back-End arbeiten würde Ich erwähne gerne die Möglichkeit, eine Ajax-Abfrage an eine mySQL-Instanz zu senden, damit sie dort sortiert wird. mySQL eignet sich hervorragend zum Sortieren von länderspezifischen Daten, da Sie Sortiervorgänge in eine bestimmte Kollatierung unter Verwendung z. ORDER BY xyz COLLATE utf8_polish_ci, COLLATE utf8_german_ci .... diese Kollatierungen würden sich um alle Sortierprobleme auf einmal kümmern. Hier

+0

Thx. für Links. Es ist wenig schade, dass JavaScript es im Kern nicht unterstützt, aber es ist immer noch eine funktionierende Lösung. –

+1

Seien Sie vorsichtig mit 'localeCompare()' in IE6: http://blog.schmichael.com/2008/07/14/javascript-collation-fail/ – BalusC

+0

@BalusC die Kommentare in diesem Artikel behaupten, dass es in der Tat Wein Schuld ist, nicht IE6's. Ich kann nichts anderes zu dem Problem finden, um es zu bestätigen oder zu widerlegen, und ich bin zu faul, um jetzt einen Testfall zu erstellen ... @Tomasz, wenn Sie diesen Weg gehen, wäre es interessant zu hören, ob die Dinge gut funktionieren IE6. –

18

ist ein Beispiel für die französisch-Alphabet, die Sie für eine benutzerdefinierte Sortierung helfen könnte:

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; 
    }; 
}; 

Um es auf einem Array von Strings zu verwenden a:

a.sort(
    alpha('ABCDEFGHIJKLMNOPQRSTUVWXYZaàâäbcçdeéèêëfghiïîjklmnñoôöpqrstuûüvwxyÿz') 
); 

1 oder -1 Add as der zweite Parameter von alpha(), um aufsteigend oder absteigend zu sortieren.
Fügen Sie als dritten Parameter true hinzu, um die Groß-/Kleinschreibung zu sortieren.

Unter Umständen müssen Sie Zahlen und Sonderzeichen, um das Alphabet Liste

+0

Wenn Sie diesen Code verwenden, finden Sie auch: http://StackOverflow.com/Questions/3630645/How-to-Compare-utf-8-strings-in-javascript/3633725#3633725 –

+0

Eek! Musst du das wirklich durchmachen? Was ist mit dem Vergessen, es zuerst in die Normalisierungsform D zu bringen? Hat PHP wirklich nichts, das zu Perl [Unicode :: Collate] (http://search.cpan.org/perldoc?Unicode%3A%3ACollet) und [Unicode :: Collate :: Locale] (http: // search) äquivalent ist. cpan.org/perldoc?Unicode%3A%3ACollate%3A%3ALocale) Module? ** Wirklich? ** Es scheint wie völliger Wahnsinn, zu versuchen, all das auf eigene Faust wiederzuerlangen! – tchrist

+2

@Tchrist, es ist nicht PHP, aber Javascript hier, und es ist wie es ist. – Mic

9

Mic-Code für nicht-genannten Zeichen verbessert hinzuzufügen:

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

Lustig, ich habe über dieses Problem nachzudenken und fertig hier gesucht , weil es mir einfällt, dass ich mein eigenes Javascript-Modul verwenden kann. Ich schrieb ein Modul eine saubere URL zu generieren, dafür ich die Eingabezeichenfolge translitate haben ... (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" 

Jetzt können Sie sortieren, damit ergibt. Sie können ex. Speichern Sie den ursprünglichen Titel im Feld "title" und das Feld zum Sortieren in "title_sort" mit dem Ergebnis von mySlug.

+2

Es ist fast eine gute Lösung. Das Problem ist, dass "ä" mit "a" gemischt wird, aber getrennt werden sollte. –