2014-04-07 3 views
11

Ich stehe hier vor einer großen Herausforderung. Ich soll gewisse chinesische "Ausdrücke" nach Pinyin sortieren.Chinesisch Sortierung nach Pinyin in Javascript mit localeCompare?

Die Frage:
Wie könnte ich sortiere nach Pinyin in Firefox?
Gibt es eine Möglichkeit, in IE 9 und 10 richtig zu sortieren? (Sie sind auch von der Website unterstützt werden)

Beispiel:

  1. 财经 传讯 公司
  2. 财经 顾问
  3. 房地产 及 按揭

Nach einem Übersetzungsbüro , so sollte die Sortierreihenfolge der Wörter sein. Die Übersetzungen sind wie folgt:

  1. Finanzkommunikationsagenturen
  2. Finanzberatungen
  3. Immobilien und Hypotheken

Die pronanciations in lateinischen Alphabet:

  1. Cai Jing Chuan xun Gong si
  2. cai jing gu wen
  3. fang di chan ji ein jie

String.localeCompare: MDN Docs

Von dem, was ich verstehe, ich bin ein zweites Argument für die String.localeCompare Verfahren bereitzustellen, das die Methode "erzählt" nach Pinyin im BCP 47 Format zu sortieren, welches zh-CN-u-co-pinyin sein sollte.

So ist der vollständige Code sollte wie folgt aussehen:

var arr = [ "财经传讯公司", "财经顾问", "房地产及按揭"]; 
console.dir(arr.sort(function(a, b){ 
    return a.localeCompare(b, [ "zh-CN-u-co-pinyin" ]); 
})); 

jsFiddle working example

ich dies erwartet, dass die Ausdrücke in der Reihenfolge auf die Konsole protokollieren ich sie in dem Array, aber die Ausgabe unterscheidet sich eingetragen.

On FX 27 ist die Reihenfolge: 3, 1, 2
in Chrom 33: 1, 2, 3
In IE 11: 1, 2, 3

Anmerkung:

Pinyin ist das offizielle phonetische System für das Transkribieren der Aussprachen der chinesischen Schriftzeichen in das lateinische Alphabet auf Mandarin .

+1

Ich würde nicht erwarten, dass localeCompare() transliteriert auf Pinyin, was ich erwarten würde, ist es führt Eingangs Vergleich unter der Annahme, Text ist Pinyin. BTW wird in FF ab 29 unterstützt (funktioniert also nicht in 27). –

+0

In der Tat! Ich habe die Kompatibilitätstabelle verpasst. Ich war zu "gewohnt" zu FX mit den Features auf MDN :) Naiv Fehler –

+0

Hier gibt es die LocalCompare MDC Dokumentation https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare – sharkbait

Antwort

1

Im Allgemeinen werden die Menschen die folgende Methode verwenden für chinesische Schriftzeichen Art Pinyin

var list=[' king ', 'a', 'li']; 
list.Sort(function (a, b) {return a.localeCompare(b); }); 

localeCompare(): mit lokaler bestimmten Reihenfolge zwei Strings zu vergleichen.

Dieser Ansatz zur Pinyin-Sortierung ist unzuverlässig.

Zweiter Weg: sehr abhängig von chinesischem Betriebssystem

auf der Browser-Kernel sehr abhängig ist, dass, wenn Ihre Website-Besucher sind durch das chinesische System oder der Internet-Explorer-Browser (Chrome) zu sagen ist, dann wird er wahrscheinlich nicht in der Lage sein, das Pinyin zu sehen, das wir erwartet haben.

Hier werde ich meine Lösung für dieses Problem vorstellen, hoffen, in der Lage sein, irgendwie abzuleiten: diese Methode unterstützt den Unicode-Zeichensatz x4e00 von 0 bis 0 x9fa5 Bereich insgesamt 20902 in Folge aus China (einschließlich Taiwan), Japan, Südkorea, chinesische Schriftzeichen, nämlich CJK-Schriftzeichen (chinesisch-japanisch-koreanisch).

var CompareStrings={.........} 
getOrderedUnicode: function (char) { 
var originalUnicode=char.charCodeAt(); 
if (originalUnicode >=0 x4e00 && originalUnicode <=0 x9fa5) { 
var index=this.Db.IndexOf (char); 
if (index >1) { 
return index + 0 x4e00; 

}} 
return originalUnicode; 
}, 


compare: function (a, b) { 
if (a==b) {return 0; } 

//here can be rewritten according to the specific needs and the writing is the empty string at the bottom the if (a.length==0) {return 1; } 

if (b.length==0) {return - 1; } 
var count=a.length >B.length? B.length: a.length; 

for (var i=0; i<count; i++) { 
var au=this.GetOrderedUnicode (a [i]); 
var bu=this.GetOrderedUnicode [i] (b); 
if (au >bu) { 
return 1; 
} else if (au <bu) { 
return - 1; 
}} 

return a.length >B.length? 1:1; 

}} 
//rewriting system native localeCompare 

Der Prototyp:

LocaleCompare = function (param) { 
    return CompareStrings.compare said (enclosing the toString(), param); 
} 

Sie die folgenden Links können durch die complete code

eine kurze Einführung des Grundsatzes der Umsetzung zum Download:

  1. Nach Pinyin sortiere guten Charakter (db): Es gibt mehrere Möglichkeiten, ein Ziel zu erreichen, ich bin Fertig mit JavaScript + C# Kombination, verwenden Sie das Skript zuerst alle Aufzählung von chinesischen Schriftzeichen setzen, und dann an die C# gute Hintergrundsortierung eingereicht und an die Rezeption ausgegeben, das ist nur die Vorbereitung, was alles kann.

  2. Identifizieren Sie zwei Zeichen, die größer ist (getOrderedUnicode): weil bei der Bestellung, nicht nur mit chinesischen Schriftzeichen und chinesischen Schriftzeichen außerhalb der Zeichen zu behandeln, so muss der Komparator alle Zeichen identifizieren können, wir hier durch Beurteilung, ob ein Zeichen chinesische Zeichen unterscheiden soll: Wenn es sich um chinesische Zeichen handelt, dann wird nach dem "Kalibrieren" des. Suchindex der Sortierindex, der Indexwert plus das Unicode - Zeichen den Ort der ersten chinesischen Zeichen festlegen Unicode-Zeichensatz des Indexwerts; Wenn keine chinesischen Zeichen vorhanden sind, geben Sie sie direkt auf den Indexwert des Unicode-Zeichensatzes zurück.

  3. Vergleichen Sie zwei Zeichenketten (vergleichen): Vergleichen Sie jeweils zwei Zeichen (innerhalb des effektiven Bereichsvergleichs, dh je kürzer die Länge der Zeichenkette). Wenn Sie eine größere als b finden, wird 1 zurückgegeben. vice return 1.

  4. Innerhalb des effektiven Bereichs nach dem Vergleich, wenn nicht die Krawatte, nur sehen, wer länger ist, wie a = '123', b = '1234', so lange b in der Zeile zurück.

EDIT

Sie auch JQuery-Plugin verwenden:

jQuery.extend(jQuery.fn.dataTableExt.oSort, { 
    "chinese-string-asc" : function (s1, s2) { 
     return s1.localeCompare(s2); 
    }, 
    "chinese-string-desc" : function (s1, s2) { 
     return s2.localeCompare(s1); 
    } 
}); 

Siehe original post.

+0

_ "Diese Herangehensweise an pinyin sort ist unzuverlässig." _ Vorausgesetzt, Pinyin-Eingabetext (wie in Ihrem Beispiel) können Sie ** erklären **, warum es unzuverlässig ist? (natürlich für einen Browser, der dies unterstützt) –

+0

Diese Methode ist zu sehr an den Browsertyp gebunden, der vom Benutzer oder dem Betriebssystem verwendet wird, das auf dem Computer ausgeführt wird. – sharkbait

+0

Sie können hier http://www.datatables.net/forums/discussion/9700/sorting-non-ascii-characters-and-data-content-html-tag-sorting/p1 einige Anmerkungen über localCompare und IE9 zum Beispiel finden .... – sharkbait

1

Nach MDN, locales und options Argumente in localeCompare() wurden in Firefox 29 hinzugefügt Sie sollten nun durch Pinyin sortieren können.

2

Dieses auf Chrome funktioniert:

const arr = ["博","啊","吃","世","中","超"] 
arr.sort((x,y)=>x.localeCompare(y, 'zh-CN')) 
0

Hier ist eine Lösung:

<!-- 
pinyin_dict_notone.js and pinyinUtil.js is available in URL below: 
https://github.com/sxei/pinyinjs 
--> 
<script src="pinyin_dict_notone.js"></script> 
<script src="pinyinUtil.js"></script> 
<script> 
jQuery.extend(jQuery.fn.dataTableExt.oSort, { 
    "chinese-string-asc": function(s1, s2) { 
    s1 = pinyinUtil.getPinyin(s1); 
    s2 = pinyinUtil.getPinyin(s2); 
    return s1.localeCompare(s2); 
    }, 
    "chinese-string-desc": function(s1, s2) { 
    s1 = pinyinUtil.getPinyin(s1); 
    s2 = pinyinUtil.getPinyin(s2); 
    return s2.localeCompare(s1); 
    } 
}); 
jQuery(document).ready(function() { 
    jQuery('#mydatatable').dataTable({ 
    "columnDefs": [ 
     { type: 'chinese-string', targets: 0 } 
    ] 
    }); 
}); 
</script>