Китайская сортировка по пиньинь в Javascript с помощью localeCompare?

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

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

Пример:

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

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

  1. Агентства финансовых коммуникаций
  2. Финансовые консультации
  3. Недвижимость и ипотека

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

  1. Цай цзин чуань сюнь гун си
  2. Цай Цзин гу вэнь
  3. фан ди чан джи ан цзе

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

Насколько я понимаю, я должен предоставить 2-й аргумент методу 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

Примечание.

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


person Daniel V.    schedule 07.04.2014    source источник
comment
Я бы не ожидал, что localeCompare() транслитерирует в пиньинь. Я ожидаю, что он выполняет сравнение, предполагая, что входной текст ЯВЛЯЕТСЯ пиньинь. Кстати, он поддерживается в FF, начиная с 29 (поэтому он не будет работать в 27).   -  person Adriano Repetti    schedule 07.04.2014
comment
Верно! Пропустил таблицу совместимости. Я слишком привык к тому, что FX имеет функции MDN :) Наивная ошибка   -  person Daniel V.    schedule 07.04.2014
comment
Здесь находится документация localCompare MDC developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/   -  person sharkbait    schedule 07.04.2014


Ответы (4)


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

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

Как правило, люди будут использовать следующий метод для сортировки китайских иероглифов пиньинь.

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

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

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

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

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

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

  4. В пределах эффективного диапазона после сравнения, если нет ничьей, просто посмотрите, кто длиннее, например, 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);
    }
} );

См. исходный пост.

person sharkbait    schedule 07.04.2014
comment
Этот подход к сортировке пиньинь ненадежен. Предполагая ввод текста пиньинь (как в вашем примере), можете ли вы объяснить, почему он ненадежен? (конечно, для браузера, который его поддерживает) - person Adriano Repetti; 07.04.2014
comment
Этот метод слишком привязан к типу браузера, используемого пользователем, или к операционной системе, работающей на машине. - person sharkbait; 07.04.2014
comment
Вы можете найти здесь datatables.net/forums/discussion/9700/ некоторые заметки о localCompare и IE9, например.... - person sharkbait; 07.04.2014
comment
Предполагая, что поддержка браузера надежна и абсолютно не связана с основной операционной системой. В своем последнем редактировании вы разместили фрагмент из плагина сортировки DataTable, он работает довольно хорошо (пожалуйста, добавьте ссылку на оригинального автора и исходный код, сам по себе этот код бесполезен). - person Adriano Repetti; 07.04.2014
comment
Я хочу сказать браузеры для изучения Интернета, такие как Chrome... извините за мой английский - person sharkbait; 07.04.2014
comment
Более того... словарь (!!!) может быть решением только в том случае, если вы не можете использовать что-либо еще. В любом случае я бы также добавил правильную атрибуцию оригинальному автору: script-home .com/javascript-implementation-method-of-pinyin.html - person Adriano Repetti; 07.04.2014
comment
Извините, учитель... вы не думаете, что вы просто немного кислотны?!?! Так или иначе... Я только пытался помочь вопрошающему... Я здесь не для того, чтобы соревноваться с вами... думайте, что хотите... - person sharkbait; 07.04.2014
comment
Извините, если я показался кислым. Обсуждение — это, как правило, хороший способ улучшить ответ (поэтому он поможет и будущим читателям) и помочь всем (как мне, и вы) чтобы понять проблему. Я знаю, что немного подчеркнул ссылки, но это хорошо для оригинальных авторов... - person Adriano Repetti; 07.04.2014

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

person Xhacker Liu    schedule 11.02.2016

Вот решение:

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