Китайский Сортировка по Пиньинь в Javascript с localeCompare?

Я столкнулся с довольно сложной задачей. Я должен сортировать определенные китайские "выражения" пиньинь.

Вопрос:
Как я могу сортировать по pinyin в Firefox?
Есть ли способ правильно сортировать в IE 9 и 10? (Они также должны поддерживаться веб-сайтом)

Пример:

  • 财经 传讯 公司
  • 财经 顾问
  • 房地产 及 按揭

Согласно агентству переводчика, это то, что должен быть порядок сортировки слов. Переводы заключаются в следующем:

  • Финансовые агентства связи
  • Финансовые консультации
  • Недвижимость и ипотечные кредиты

Провозглашения в латинском алфавите:

  • cai jing chuan xun gong si
  • cai jing gu wen
  • fang di chan ji a jie

String.localeCompare: Документы MDN

Из того, что я понимаю, я должен предоставить второй аргумент методу String.localeCompare, который "говорит" метод сортировать по пиньину в формате BCP 47, который должен быть zh-CN-u-co-pinyin.

Таким образом, полный код должен выглядеть следующим образом:

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

jsFiddle рабочий пример

Я ожидал, что это приведет к консолидации выражений в порядке, в который я ввел их в массив, но выход отличается.

На FX 27 порядок: 3, 1, 2
В Chrome 33: 1, 2, 3
В IE 11:1, 2, 3

Примечание:

Пиньинь является официальной фонетической системой для транскрипции мандарина произношения китайских иероглифов в латинском алфавите.

Ответ 1

Это работает в Chrome:

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

Ответ 2

В общем, люди будут использовать следующий метод для китайских символов: pinyin sort

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

localeCompare(): с локальным конкретным заказом для сравнения двух строк.

Этот подход к сортировке пиньинов является ненадежным.

Второй способ: сильно зависит от китайской операционной системы

Является очень зависимым от ядра браузера, то есть, если посетители вашего сайта находятся через китайскую систему или браузер Internet Explorer (Chrome), то он, вероятно, не сможет увидеть, как пиньинь сортирует результат, который мы ожидали.

Здесь я представлю свое решение этой проблемы, надеюсь, что так или иначе получится: этот метод поддерживает набор символов Unicode x4e00 от 0 до 0 x9fa5 в общей сложности 20902 последовательных от Китая (включая Тайвань), Японию, Южную Корею, китайские иероглифы, а именно символы CJK (китайские японцы).

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 

Прототип:

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

вы можете по ссылкам ниже скачать полный код

Краткое введение принципа реализации:

  • В соответствии с пиньиньским добрым характером (db): существует несколько способов достижения цели, я делаю это с использованием комбинации JavaScript + С#, используйте script, сначала поместив все перечисления китайских символов, а затем представленный на С#хороший вид фона, и вывод на стойку регистрации, это всего лишь подготовка, что все может.

  • Идентифицируйте двух символов, которые больше (getOrderedUnicode): потому что при заказе не только иметь дело с китайскими иероглифами и китайскими символами за пределами символов, поэтому компаратор должен иметь возможность идентифицировать все символы, мы здесь, судя, должен ли персонаж различать китайские иероглифы: если это китайские иероглифы, то индекс поиска хорошего слова в библиотеке, значение индекса плюс символ Юникода задают местоположение первых китайских символов, после "калибровки" набор символов Unicode значения индекса; Если не китайские иероглифы, то верните его прямо на значение индекса для набора символов Юникода.

  • Сравните две строки (сравнивайте): сравнивая два каждого из символов (в пределах эффективного сравнения значений, т.е. чем короче длина строки), если вы найдете больше, чем b, он возвращает 1, vice return 1.

  • В пределах эффективного диапазона после сравнения, если у вас нет галстука, просто посмотрите, кто длиннее, например a = '123', b = '1234', так долго b для того, чтобы выровнять по спине.

ИЗМЕНИТЬ

Вы также можете использовать плагин 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);
    }
} );

См. исходное сообщение.

Ответ 3

В соответствии с MDN, locales и options аргументы в localeCompare() были добавлены в Firefox 29. Вы должны иметь возможность сортировать по пиньинь сейчас.

Ответ 4

Вот решение:

<!--
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>