Penyortiran Cina berdasarkan Pinyin dalam Javascript dengan localeCompare?

Saya menghadapi tantangan yang cukup besar di sini. Saya harus mengurutkan "ekspresi" China tertentu berdasarkan pinyin.

Pertanyaannya:
Bagaimana cara mengurutkan berdasarkan pinyin di Firefox?
Apakah ada cara untuk mengurutkan dengan benar di IE 9 dan 10? (Mereka juga harus didukung oleh situs web)

Contoh:

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

Menurut agen penerjemah, seperti inilah seharusnya urutan kata-katanya. Terjemahannya adalah sebagai berikut:

  1. Badan komunikasi keuangan
  2. Konsultan keuangan
  3. Real estat dan hipotek

Pengucapan dalam alfabet latin:

  1. cai jing chuan xun gong si
  2. cai jing gu wen
  3. taring di chan ji an jie

String.localeCompare: Dokumen MDN

Dari apa yang saya pahami, saya akan memberikan argumen ke-2 pada metode String.localeCompare yang "memberi tahu" metode untuk mengurutkan berdasarkan pinyin dalam format BCP 47 yang seharusnya zh-CN-u-co-pinyin.

Jadi kode lengkapnya akan terlihat seperti ini:

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

contoh kerja jsFiddle

Saya mengharapkan ini untuk login untuk menghibur ekspresi sesuai urutan saya memasukkannya ke dalam array tetapi hasilnya berbeda.

Di FX 27, urutannya adalah: 3, 1, 2
Di Chrome 33: 1, 2, 3
Di IE 11: 1, 2, 3

Catatan:

Pinyin adalah sistem fonetik resmi untuk menyalin pengucapan Mandarin dari karakter Cina ke dalam alfabet Latin.


person Daniel V.    schedule 07.04.2014    source sumber
comment
Saya tidak berharap localeCompare() transliterasi ke Pinyin, Yang saya harapkan adalah ia melakukan perbandingan dengan asumsi teks masukan IS Pinyin. BTW itu didukung di FF mulai dari 29 (jadi tidak akan berfungsi di 27).   -  person Adriano Repetti    schedule 07.04.2014
comment
Memang! Saya melewatkan tabel kompatibilitas. Saya terlalu terbiasa dengan FX yang memiliki fitur di MDN :) Kesalahan Naiv   -  person Daniel V.    schedule 07.04.2014
comment
Di sini ada dokumentasi MDC localCompare developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/   -  person sharkbait    schedule 07.04.2014


Jawaban (4)


Ini berfungsi di Chrome:

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

Secara umum, orang akan menggunakan metode berikut untuk mengurutkan pinyin karakter Cina

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

localeCompare () : dengan urutan spesifik lokal untuk membandingkan dua string.

Pendekatan terhadap pengurutan pinyin ini tidak dapat diandalkan.

Cara kedua: sangat bergantung pada sistem operasi Cina

Sangat bergantung pada kernel browser Artinya, jika pengunjung situs Anda melalui sistem Cina, atau browser Internet explorer (Chrome), maka dia mungkin tidak akan dapat melihat pinyin mengurutkan hasil yang kami harapkan.

Di sini saya akan memperkenalkan solusi saya untuk masalah ini, berharap dapat memperolehnya: metode ini mendukung kumpulan karakter Unicode x4e00 dari 0 hingga 0 area x9fa5 total 20902 berturut-turut dari Tiongkok (termasuk Taiwan), Jepang, Korea Selatan, Aksara Cina yaitu aksara CJK (Cina Jepang Korea).

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 

Prototipe:

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

Anda dapat melalui tautan di bawah untuk mengunduh kode lengkap

Pengenalan singkat tentang prinsip implementasi:

  1. Menurut pinyin sort good character (db): ada beberapa cara untuk mencapai suatu tujuan, saya selesai dengan kombinasi JavaScript + c#, gunakan skrip terlebih dahulu masukkan semua enumerasi karakter Cina, lalu serahkan ke c #good background sort , dan output ke front desk, ini baru persiapannya, apa saja bisa.

  2. Identifikasi dua karakter yang lebih besar (getOrderedUnicode): karena ketika memesan, tidak hanya berurusan dengan karakter Cina, dan karakter Cina di luar karakter, jadi pembanding harus dapat mengidentifikasi semua karakter, kami di sini dengan menilai apakah suatu karakter adalah untuk membedakan karakter Cina: jika itu adalah karakter Cina, maka indeks pencarian perpustakaan kata yang baik, nilai indeks ditambah karakter Unicode mengatur lokasi karakter Cina pertama, adalah setelah "kalibrasi" dari kumpulan karakter Unicode dari nilai indeks; Jika bukan karakter Cina, kembalikan langsung pada nilai indeks kumpulan karakter Unicode.

  3. Bandingkan dua string (bandingkan): dengan membandingkan dua masing-masing karakter (dalam perbandingan rentang efektif, yaitu semakin pendek panjang string), jika Anda menemukan lebih besar dari b, ia mengembalikan 1, sebaliknya mengembalikan 1.

  4. Dalam rentang efektif setelah perbandingan jika belum seri, lihat saja siapa yang lebih panjang, misalnya a='123', b='1234', maka b panjang untuk mendayung di belakang.

EDIT

Anda juga dapat menggunakan plugin JQuery:

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

Lihat postingan asli.

person sharkbait    schedule 07.04.2014
comment
Pendekatan terhadap pengurutan pinyin ini tidak dapat diandalkan. Dengan asumsi teks masukan Pinyin (seperti pada contoh Anda), dapatkah Anda menjelaskan mengapa teks tersebut tidak dapat diandalkan? (tentu saja untuk browser yang mendukungnya) - person Adriano Repetti; 07.04.2014
comment
Cara ini terlalu terikat dengan jenis browser yang digunakan pengguna atau sistem operasi yang berjalan di mesin. - person sharkbait; 07.04.2014
comment
Anda dapat menemukannya di sini datatables.net/forums/discussion/9700/ beberapa catatan tentang localCompare dan IE9 misalnya.... - person sharkbait; 07.04.2014
comment
Dengan asumsi dukungan browser dapat diandalkan dan sama sekali tidak terkait dengan sistem operasi yang mendasarinya. Pada pengeditan terakhir, Anda memposting cuplikan dari plug-in penyortiran DataTable, ini berfungsi dengan cukup baik (harap tambahkan referensi ke penulis asli dan kode sumber, kode itu saja tidak ada gunanya). - person Adriano Repetti; 07.04.2014
comment
Saya ingin mengatakan browser untuk menjelajahi internet seperti Chrome... maaf untuk bahasa Inggris saya - person sharkbait; 07.04.2014
comment
Terlebih lagi... kamus (!!!) hanya bisa menjadi solusi jika Anda tidak dapat menggunakan yang lain. Pokoknya saya juga akan menambahkan atribusi yang tepat ke penulis asli: script-home .com/javascript-implementation-method-of-pinyin.html - person Adriano Repetti; 07.04.2014
comment
Maaf guru.... kamu tidak berpikir kamu hanya sedikit asam?!?! Pokoknya... Saya hanya mencoba membantu si penanya.... Saya di sini bukan untuk bersaing dengan Anda... pikirkan apa yang Anda inginkan.... - person sharkbait; 07.04.2014
comment
Maaf jika aku memang terlihat asam. Diskusi, biasanya, merupakan cara yang baik untuk meningkatkan jawaban (sehingga akan membantu pembaca masa depan juga) dan untuk membantu semua orang (baik saya dan Anda) untuk memahami masalahnya. Saya tahu saya sedikit menekankan tentang referensi tetapi itu bagus untuk penulis asli... - person Adriano Repetti; 07.04.2014

Menurut MDN, locales dan options argumen di localeCompare() telah ditambahkan di Firefox 29. Anda seharusnya bisa mengurutkan berdasarkan pinyin sekarang.

person Xhacker Liu    schedule 11.02.2016

Ini solusinya:

<!--
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>
person ahgood    schedule 16.08.2017