Iirc, Oracle thực hiện sắp xếp từ vựng 3 tầng (nhưng chú ý đến lời khuyên của Alex Poole và kiểm tra cài đặt NLS trước):
- Sắp xếp đầu tiên theo các ký tự cơ bản bỏ qua chữ hoa và dấu, các chữ số đứng sau các chữ cái trong chuỗi đối chiếu.
- Thứ hai, về các mối quan hệ, hãy phân loại theo cách tôn trọng các dấu phụ, bỏ qua chữ hoa và chữ thường.
- Thứ ba, các mối quan hệ sắp xếp theo trường hợp.
Bạn có thể mô phỏng hành vi bằng cách sử dụng apis ngôn ngữ javascript bằng cách bắt chước lần lượt từng bước trong một hàm so sánh tùy chỉnh, ngoại trừ đảo ngược chữ cái-chữ số trong chuỗi đối chiếu.
Giải quyết vấn đề thứ hai bằng cách xác định 10 điểm mã liền kề không đại diện cho chữ số và nằm ngoài tập hợp các điểm mã có thể xuất hiện trong chuỗi bạn đang sắp xếp. Ánh xạ các chữ số vào thứ tự bảo toàn dải mã đã chọn. Khi bạn sắp xếp, hãy chỉ định phần mở rộng đối chiếu Unicode 'trực tiếp' có nghĩa là 'sắp xếp theo điểm mã'. Sửa lại sau khi sắp xếp.
Trong mã PoC bên dưới, tôi đã chọn một số ký tự 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)); } ); } );
Chỉnh sửa
Hàm cmptiered
sắp xếp hợp lý sau bình luận của Nina Scholz.