Как вы сортируете символы CJK (азиатские) в Perl или любом другом языке программирования?

Как сортировать китайские, японские и корейские (CJK) символы в Perl?

Насколько я могу судить, сортировка символов CJK по количеству штрихов, а затем по радикалу, по-видимому, является способом сортировки этих языков. Есть также несколько методов сортировки по звукам, но они менее распространены.

Я пробовал использовать:

perl -e 'print join(" ", sort qw(工 然 一 人 三 古 二 )), "\n";'
# Prints: 一 三 二 人 古 工 然 which is incorrect

И я пытался использовать Unicode::Collate из CPAN, но он говорит:

По умолчанию унифицированные иероглифы CJK упорядочены в порядке кодовых точек Unicode...

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

Если вы знаете, как сортировать CJK на других языках, было бы полезно упомянуть об этом в ответе на этот вопрос.


person Neil    schedule 08.10.2010    source источник
comment
Это глупый вопрос. Как вы сортируете китайские слова? или Как вы сортируете корейские слова? имело бы смысл, но как вы сортируете символы CJK? не имеет никакого смысла.   -  person    schedule 09.10.2010
comment
Это имеет смысл, потому что в большинстве чармапов, поддерживающих несколько азиатских языков, китайский, японский и корейский объединены в CJK.   -  person Oso    schedule 21.03.2014


Ответы (3)


См. TR38, чтобы узнать о грязных деталях и крайних случаях. Это не так просто, как вы думаете и как выглядит этот пример кода.

use 5.010;
use utf8;
use Encode;
use Unicode::Unihan;
my $u = Unicode::Unihan->new;

say encode_utf8 sprintf "Character $_ has the radical #%s and %d residual strokes." , split /[.]/, $u->RSUnicode($_) for qw(工 然 一 人 三 古 二);
__END__
Character 工 has the radical #48 and 0 residual strokes.
Character 然 has the radical #86 and 8 residual strokes.
Character 一 has the radical #1 and 0 residual strokes.
Character 人 has the radical #9 and 0 residual strokes.
Character 三 has the radical #1 and 2 residual strokes.
Character 古 has the radical #30 and 2 residual strokes.
Character 二 has the radical #7 and 0 residual strokes.

См. http://en.wikipedia.org/wiki/List_of_Kangxi_radicals для сопоставления с радикальным порядковым номером для подсчета ударов.

person daxim    schedule 08.10.2010
comment
Знаете ли вы, как использовать модуль Unicode::Collate? В частности, знаете ли вы, как передать sub{} в качестве параметра overrideCJK и запустить его при запуске Unicode::Collate-›sort()? Я мог бы использовать Unicode::Unihan, чтобы получить количество штрихов и радикальную информацию для фактической сортировки символов, но функция overrideCJK не выполняется. - person Neil; 09.10.2010
comment
Нет, но вы можете открыть новый вопрос для этой темы. - person daxim; 09.10.2010
comment
Учитывая глупость вопроса, такой глупый ответ заслуживает принятия. В понятии сортировки символов CJK нет смысла. - person ; 09.10.2010
comment
Большая часть вопроса касается сортировки по количеству штрихов, что легко достигается. Не заставляй меня называть тебя дураком. - person daxim; 09.10.2010
comment
@daxim: У вас есть конкретный пример, когда кому-то нужна или когда-либо понадобится сортировать китайские иероглифы независимо от основного языка? Глупый вопрос и глупый ответ. - person ; 10.10.2010
comment
@Kinopiko: я имел в виду сортировку фраз CJK, которую вам нужно делать в тех же ситуациях, когда вы сортируете английские фразы, например, в указателе книги или всякий раз, когда вы хотите написать список, в котором люди могут найти что-то. Однако, чтобы отсортировать фразу, вам нужно сначала отсортировать символы. - person Neil; 11.10.2010
comment
@Neil: Если вы хотите отсортировать японские фразы, для этого есть ответ. Если вы хотите сортировать китайские фразы, это другой вопрос. Если вы хотите отсортировать корейские фразы, это другой вопрос. Но нет такой вещи, как сортировка CJK-фраз - ничего не значит сортировка слов из трех разных языков. - person ; 11.10.2010

Японская телефонная книга сортируется по фонетическому принципу (сопоставление годзюон). Однако порядок символов кандзи не основан на фонетике, независимо от того, используются ли они в Unicode, JIS, S-JIS или EUC. Только кана основана на фонетическом порядке. Это означает, что вы не можете осмысленно сопоставлять без фонетического преобразования!

Например:

a) kanji:           東京駅
b) kana converted:  とうきょうえき
c) romanisation:    tôkyô eki

С помощью b) или c) вы можете сделать осмысленную сортировку. Но нельзя обойтись только а). Конечно, вы можете запустить простую функцию сортировки, но для японского языка это не имеет смысла.

person kmugitani    schedule 09.10.2010
comment
Это ответ на разумный вопрос «Как вы сортируете японские слова?», но он не отвечает на вопрос, который на самом деле был задан, поэтому я не могу проголосовать за него. - person ; 09.10.2010
comment
@Kinopiko: Да, я должен с тобой согласиться. Оригинальный вопрос не очень хороший. - person kmugitani; 10.10.2010

Проверьте мой rubygem toPinyin, который преобразует китайский символ в кодировке UTF-8 в их PinYin (произношение). И тогда можно было легко сделать сортировку на пиньине.

Просто, gem install toPinyin

require 'toPinyin'

words = "
人
没有
理想
跟
咸鱼
有
什么
区别
".split("\n")

words.sort! {|a ,b|   a.pinyin.join <=> b.pinyin.join }

https://github.com/pierrchen/toPinyin

person pierrotlefou    schedule 06.07.2011
comment
Как вы получили данные для этого? - person Pacerier; 23.02.2013
comment
Я не знаю для Ruby, но для Python это так же просто, как github.com/avian2/unidecode - person Polv; 10.12.2018