Iirc, Oracle mengimplementasikan pengurutan leksikografis 3 tingkat (tetapi perhatikan saran Alex Poole dan periksa pengaturan NLS terlebih dahulu):
- Urutkan pertama berdasarkan karakter dasar dengan mengabaikan huruf besar/kecil dan diakritik, angka muncul setelah huruf dalam urutan susunan.
- Kedua, pada jenis dasi menghormati diakritik, mengabaikan kasus.
- Ketiga, pada dasi, urutkan berdasarkan kasus.
Anda dapat meniru perilaku menggunakan apis lokal javascript dengan meniru setiap langkah secara bergantian dalam fungsi perbandingan khusus, dengan pengecualian inversi huruf-digit dalam urutan susunan.
Atasi yang terakhir dengan mengidentifikasi 10 titik kode bersebelahan yang tidak mewakili angka dan yang berada di luar kumpulan titik kode yang mungkin terjadi dalam string yang Anda urutkan. Memetakan digit ke urutan pelestarian rentang titik kode yang dipilih. Saat Anda mengurutkan, tentukan ekstensi penyusunan Unicode 'langsung' yang berarti 'penyortiran berdasarkan titik kode'. Petakan ulang setelah disortir.
Dalam kode PoC di bawah ini saya telah memilih beberapa karakter cyrillic.
function cmptiered(a,b) {
//
// aka oracle sort
//
return lc_base.compare(a, b) || lc_accent.compare(a, b) || lc_case.compare(a, b);
} // cmptiered
var lc_accent = new Intl.Collator('de', { sensitivity: 'accent' });
var lc_base = new Intl.Collator('de-DE-u-co-direct', { sensitivity: 'base' });
var lc_case = new Intl.Collator('de', { caseFirst: 'lower', sensitivity: 'variant' });
var array = ['Ba12nes','Apfel','Banane','banane','abc','ABC','123','2', null, 'ba998ne' ];
// Map onto substitute code blocks
array = array.map ( function ( item ) { return (item === null) ? null : item.replace ( /[0-9]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - "0".charCodeAt(0) + "\u0430".charCodeAt(0)); } ); } );
array.sort(cmptiered);
// Remap substitute code point
array = array.map ( function ( item ) { return (item === null) ? null : item.replace ( /[\u0430-\u0439]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - "\u0430".charCodeAt(0) + "0".charCodeAt(0)); } ); } );
Sunting
Fungsi cmptiered
disederhanakan mengikuti komentar Nina Scholz.