сортировка японских символов с помощью Swift - PullRequest
0 голосов
/ 26 января 2019

У меня есть следующая строка для сортировки списка элементов по имени:

let nameSort = NSSortDescriptor(key: "item.itemName", ascending: true, selector: #selector(NSString.caseInsensitiveCompare))

Это отлично работает для английских имен. Но с японцами сортируются хирагана, катакана и кандзи отдельно, а не переплетаются. Я заметил, что приложение контактов iOS сортирует правильно и не разделяет три отдельных сценария. Хотите знать, как этого добиться?

1 Ответ

0 голосов
/ 26 января 2019

Вы можете использовать localizedCompare или localizedCaseInsensitiveCompare для решения проблемы сортировки хирагана-катакана, но не проблему кандзи.

Вы сравниваете это с приложением «Контакты»: к сожалению, «Контакты» на самом деле фиксируют то, что вы вводите фонетически , сохраняя фуригану в отдельном phoneticFamilyName (например, Танака как タ ナ カ), тогда как финальное кандзи (например, , 田中) хранится в familyName, например. Это происходит потому, что после того, как входные данные переведены в кандзи, все показания отображаются в одной последовательности юникода. Например. независимо от того, вводите ли вы 中 через チ ュ ウ или な か (в зависимости от того, в каком слове вы его вводите), полученный в результате символ 中 по-прежнему будет просто unicode 0x4e2d. Вам нужно сохранить фонетическое правописание в отдельном поле, если вы хотите знать, как вы попали к этому персонажу.

Суть в том, чтобы попросить алгоритм сортировки выяснить, какая фуригана для некоторой случайной последовательности кандзи является нетривиальной проблемой, потому что у нее нет способа узнать, какой на йоми или Кун Йоми или Нанори применяется для любого данного кандзи. Вот почему приложение «Контакты» хранит это в отдельном поле. Есть CFStringTransform преобразований между кана и ромадзи, но не для кандзи.

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

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