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

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

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

Я пытался использовать:

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 08 октября 2010

См. 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 для сопоставления порядкового номера радикала с количеством штрихов.

2 голосов
/ 06 июля 2011

Проверьте мой 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

2 голосов
/ 09 октября 2010

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

Например:

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

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

...