Подтвердить что ты не робот

Что означает сортировка на неалфавитных (то есть азиатских) языках?

У меня есть код, который сортирует столбцы таблицы по свойствам объекта. Мне пришло в голову, что на японском или китайском (не алфавитные языки) строки, которые отправляются в функцию сортировки, будут сравниваться с тем, как будет выглядеть алфавитный язык.

Возьмем, например, список японских фамилий:

寿拘 (Suzuki)
松坂 (Matsuzaka)
松井 (Matsui)
山田 (Yamada)
藤本 (Fujimoto)

Когда я сортирую вышеуказанный список через Javascript, результат:

寿拘 (Suzuki)
山田 (Yamada)
松井 (Matsui)
松坂 (Matsuzaka)
藤本 (Fujimoto)

Это отличается от упорядочения японского syllabary, который бы упорядочил список фонетически (как японский словарь):

寿拘 (Suzuki)
藤本 (Fujimoto)
松井 (Matsui)
松坂 (Matsuzaka)
山田 (Yamada)

Что я хочу знать:

  • Действительно ли один двухбайтовый символ сравнивается с другим в функции сортировки?
  • Что действительно происходит в таком роде?
  • (Дополнительный кредит) Является ли результат такого рода означать что-нибудь вообще? Действительно ли концепция сортировки работает на азиатских (и других) языках? Если да, что это значит и к чему нужно стремиться при создании функции сравнения для этих языков?

ДОБАВЛЕНИЕ ДЛЯ ПОДТВЕРЖДЕНИЯ ОТВЕТОВ И РЕЗУЛЬТАТОВ: [/strong >

Во-первых, спасибо всем, кто внес свой вклад в обсуждение. Это было очень информативно и полезно. Специальные крик-ауты bobince, Ли Райан, Gumbo, Джеффри Чжэн и Ларри К, для их углубленного и продуманного анализа. Я наградил галочкой Ларри К за то, что указал на решение, которое мой вопрос не смог предвидеть, но я поднял все ответы, которые я нашел полезными.

Похоже, что консенсус заключается в следующем:

  • Китайские и японские символьные строки сортируются по кодовым точкам Юникода, и их упорядочение может основываться на обосновании, которое может быть каким-то образом понятным для знающих читателей, но вряд ли имеет практическое значение для оказания помощи пользователям чтобы найти информацию, которую они ищут.

  • Функция сравнения, которая требуется для сортировки семантически или фонетически полезной, слишком громоздка, чтобы рассматривать ее, особенно потому, что результаты, вероятно, были бы менее удовлетворительными, и в любом случае алгоритмы сравнения должны быть изменены для каждого языка. Лучше всего разрешить сортировку, даже не пытаясь выполнить функцию сравнения.

  • Возможно, я задал здесь неправильный вопрос. То есть я слишком много думал "внутри коробки", не учитывая, что реальный вопрос заключается не в том, как сделать сортировку полезной на этих языках, но как я могу предоставить пользователю полезный способ поиска элементов в списке. Западники автоматически думают о сортировке для этой цели, и я был виноват в этом. Ларри К указал мне на статью в Википедии, в которой предлагается функция фильтрации может быть более полезна для азиатских читателей. Это то, что я планирую проводить, по крайней мере, так же быстро, как сортировка, на стороне клиента. Я сохраню сортировку столбцов, потому что она хорошо понята на западных языках, и потому, что говорящие на любом языке найдут сортировку дат и других числовых типов данных полезными. Но я также добавлю этот механизм фильтрации, который будет полезен в длинных списках для любого языка.

4b9b3361

Ответ 1

Вы можете реализовать Unicode Collation Algorithm в Javascript, если вы хотите что-то лучше, чем сортировка JS по умолчанию для строк. Могу улучшить некоторые вещи. Хотя, как говорится в документе Unicode:

Сортировка неравномерна; различается по языку и культуре: Немцы, французы и шведы сортируют одинаковые символы по-разному. Это может также могут варьироваться в зависимости от конкретного применения: даже на том же языке, словари могут сортироваться по-разному, чем телефонные книги или книжные индексы. Для неалфавитные сценарии, такие как Восток Азиатские идеограммы, сопоставление может быть либо фонетическим, либо основанным на появление символа.

Статья в Википедии указывает, что, поскольку сортировка настолько жестка в неалфавитных сценариях, теперь дни отвечают за то, чтобы сделать ее очень простой для поиска информации путем ввода символов, а не просмотра списка.

Я предлагаю вам поговорить с действительно знающими конечными пользователями вашего приложения, чтобы узнать, как им лучше всего вести себя. Проблема заказа китайских иероглифов не уникальна для вашего приложения.

Кроме того, если вы не хотите внедрять сортировку в вашей системе, другое решение позволит вам создать службу Ajax, которая хранит имена в MySql или другой базе данных, а затем просматривает данные с помощью инструкции заказа.

Ответ 2

Действительно ли один двухбайтовый символ сравнивается с другим в функции сортировки?

Нативный тип String в JavaScript основан на кодовых модулях UTF-16, и это то, что сравнивается. Для символов в базовой многоязычной плоскости (которые все они есть), это то же самое, что и кодовые точки Юникода.

Термин "двойной байт, как и в кодировках, таких как Shift-JIS, не имеет смысла в веб-контексте: строки DOM и JavaScript являются изначально Unicode, исходные байты на кодированной странице, полученные браузером, давно прошли.

Является ли результат такого рода чем-то вообще?

Мало. Кодовые точки Unicode не претендуют на то, чтобы предлагать какой-либо конкретный заказ... для одного, потому что нет общепринятого порядка. Даже для самого основного случая латинских символов ASCII языки не согласны (например, о том, являются ли теги v и w одинаковыми буквами, или верхний регистр i равен i или İ). И CJK становится намного мрачнее, чем это.

Основной блок Unicode CJK Unified Ideographs упорядочивается радикальным и количеством штрихов (Kangxi dictionary order), что может быть смутно полезным. Но используйте символы из любого из других блоков расширения CJK или смешивайте их в некоторых каналах или romaji, и между ними не будет никакого значимого упорядочения.

Консорциум Unicode попытаться определить некоторые общие правила упорядочения, но он сложный и обычно не пытается на уровне языка. Системы, которые действительно нуждаются в чувствительной к языку способности сортировки (например, ОС, базы данных), как правило, имеют свои собственные схемы сортировки.

Это отличается от порядка японской слоговой книги

Да. В общем и целом, помимо проблем с сортировкой в ​​целом, это сложная задача - правильно обрабатывать иероглифы по слогу, потому что вы должны угадывать произношение. JavaScript не может реально знать, что "藤 本" означает "Фуджимото", а не "touhon"; такого рода вещи требуют глубоких встроенных словарей и все еще ненадежных эвристик... не то, что вы хотите построить на языке программирования.

Ответ 3

Строки сравниваются по символам, где значение кодовой точки определяет порядок:

Сравнение строк использует простой лексикографический порядок в последовательностях значений значения кодовой точки. Нет попытки использовать более сложные, семантически ориентированные определения равенства символов или строк и порядка сортировки, определенных в спецификации Unicode. Поэтому строки, которые канонически равны в соответствии со стандартом Unicode, могут быть неравными. По сути, этот алгоритм предполагает, что обе строки уже в нормализованной форме.

Если вам нужно больше этого, вам нужно будет использовать сравнение строк, которое может принимать во внимание сортировки.

Ответ 4

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

к чему нужно стремиться при создании сравнить функцию для этих языков?

Один из способов сделать это - вам нужно создать программу, которая может "читать" символы; то есть, можно отображать символы ханзи/кандзи на их "звук" (чтение пиньинь/хирагана). На простейшем уровне это означает базу данных, которая отображает ханзи/кандзи на звуки. Конечно, это сложнее, чем кажется (каламбур не предназначен), так как у многих персонажей могут быть разные произношения в разных контекстах, а у китайцев есть много разных диалектов.

Другой способ - заказать порядок штрихов. Это означает, что должна быть база данных, которая отображает hanzi/kanji на их штрихи. Другая проблема: китайцы и японцы пишут в разных интрузионных ордерах. Однако, помимо различий в японском и китайском языках, использование порядка штрихов гораздо более согласовано в одном тексте, поскольку символы ханзи/кандзи почти всегда записываются с использованием того же порядка штрихов, независимо от того, что они имели в виду и как они читаются. Аналогичная идея состоит в том, чтобы сортировать по радикалам, а не обычным порядкам инсульта.

Третий способ - сортировка по кодам Юникода. Это просто, и всегда дает неоспоримо последовательное упорядочение; однако проблема заключается в том, что порядок сортировки для человека не имеет смысла.

Последний способ - переосмыслить потребность в абсолютном упорядочении и просто использовать некоторую эвристику для сортировки по релевантности потребностям пользователя. Например, в программном обеспечении корзины покупок вы можете сортировать в зависимости от пользовательских привычек покупки или по цене. Этот вид позволяет избежать проблемы, но большую часть времени он работает (за исключением случаев, когда вы компилируете словарь).

Как вы заметили, первые два метода требуют создания огромной базы данных для сопоставления "один ко многим", но они все равно не всегда дают полезный результат. Третий метод также требует огромную базу данных, но на многих языках программирования эта база данных встроена в язык. Последний способ немного эвристический, вероятно, самый полезный, однако они обречены никогда не давать последовательного упорядочения (намного хуже, чем первые два метода).

Ответ 5

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

На китайском или корейском языках или на других языках, у которых нет 3 разных алфавитов (один из которых довольно нерегулярный), вероятно, это будет менее проблематичным.

Ответ 6

Они сортируются по кодовому значению, по возрастанию. Это, безусловно, бессмысленно для читателей. Невозможно разработать разумную схему сортировки для японцев, но сортировка китайских иероглифов тяжелая (отчасти потому, что мы не обязательно знаем, смотрим ли мы на японский или китайский язык), и многие программисты подходят к этому решению.

Ответ 7

Стандартные функции сравнения строк во многих языках программирования предназначены для обеспечения того, чтобы строки можно сортировать в уникальный порядок, чтобы алгоритмы, такие как бинарный поиск и обнаружение дубликатов, работали правильно. Чтобы сортировать данные в моде, значимых для читателя, нужно знать, что представляют данные. Например, в списке английских названий фильмов "El Mariachi" обычно сортируется под "E", но в списке испанских названий фильмов он будет сортироваться под "M". Приложение будет нуждаться в информации, кроме той, которая содержится в самих строках, чтобы знать, как строки должны быть отсортированы.

Ответ 8

Ответы на Q1 (вы можете сортировать) и Q3 (сорт осмысленный) являются "да" для китайцев (с точки зрения материка). Для Q2 (как сортировать):

Все китайские символы имеют определенное произношение (некоторые из них являются полифоническими), как определено в pinyin, и это гораздо более распространено (как в все китайские словари) сортировать по пиньину, где нет никакой двусмысленности. Символы с тем же произношением затем сортируются по порядку штрихов.

Полифонические персонажи создают дополнительный вызов для сортировки, поскольку их пиньинь обычно зависит от того, в каком они находятся (я слышал, что японские персонажи могут быть еще более волосатыми). Например, символ 阿 произносится как (1) в 阿姨 (тон в скобках) и e (1) в 阿胶. Поэтому, если вам нужно сортировать слова или предложения, вы не можете просто смотреть на одного символа за раз от каждого элемента.

Ответ 9

Напомним, что в JavaScript вы можете передать в sort() функцию, в которой вы можете реализовать сортировку самостоятельно, чтобы достичь рода, который имеет значение для людей:

myarray.sort(function(a,b){

//return 0, 1, or -1 based on the comparison of the two strings

});