Что означает сортировка в неалфавитных (то есть азиатских) языках? - PullRequest
29 голосов
/ 22 сентября 2010

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

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

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

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

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

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

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

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

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

ДОБАВЛЕНИЕ ДЛЯ ОБОБЩЕНИЯ ОТВЕТОВ И ВЫВОДОВ ВЫВОДОВ:

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

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

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

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

Ответы [ 9 ]

23 голосов
/ 22 сентября 2010

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

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

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

Значит ли результат такого рода вообще что-нибудь?

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

Главный блок Unicode CJK Unicode CJK упорядочен по радикалам и количеству штрихов (порядок словаря Канси), что может быть весьма полезным. Но используйте символы из любых других блоков расширения CJK или смешайте их в кане или ромадзи, и между ними не будет значимого упорядочения.

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

Это отличается от заказа японского слога

Да. Помимо проблем сопоставления в целом, очень сложно точно обработать кандзи с помощью слога, потому что вы должны угадывать произношение. JavaScript не может реально знать, что под «藤 本» вы подразумеваете «Fujimoto», а не «touhon»; Для такого рода вещей требуются глубокие встроенные словари и все еще ненадежная эвристика ... а не то, что вы хотите встроить в язык программирования.

10 голосов
/ 22 сентября 2010

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

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

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

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

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

3 голосов
/ 22 сентября 2010

Другие ответили на другие вопросы, я отвечу на этот:

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

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

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

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

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

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

3 голосов
/ 22 сентября 2010

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

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

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

1 голос
/ 22 сентября 2010

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

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

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

1 голос
/ 22 сентября 2010

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

1 голос
/ 22 сентября 2010

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

1 голос
/ 22 сентября 2010

Да, персонажи сравниваются. Их обычно сравнивают, основываясь на их кодовых точках Unicode, которые сильно различаются между хираганой и кандзи, что делает этот вид потенциально бесполезным на японском языке. (Кандзи позаимствован у китайцев, но порядок, в котором они будут отображаться на китайском, не соответствует порядку хираганы, который бы обозначал то же значение). Существуют сопоставления, которые могут сделать некоторые символы «равными» для целей сравнения, но я не знаю, есть ли такой, который будет считать кандзи эквивалентным хирагане, которая включает в себя его произношение - тем более что персонаж может иметь несколько разных произношений.

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

0 голосов
/ 22 сентября 2010

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

myarray.sort(function(a,b){

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

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...