2010-10-08 18 views
8

¿Cómo se clasifican los caracteres chinos, japoneses y coreanos (CJK) en Perl?¿Cómo se clasifican los caracteres CJK (asiáticos) en Perl, o con cualquier otro lenguaje de programación?

Por lo que puedo decir, la clasificación de los caracteres CJK por trazo, luego por radical, parece ser la forma en que se ordenan estos idiomas. También hay algunos métodos que ordenan por sonidos, pero esto parece menos común.

He intentado usar:

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

Y he intentado usar Unicode :: Intercalar de CPAN, pero dice:

Por defecto, CJC Unificado Ideographs son ordenados en Orden de punto de código Unicode ...

Si pudiera obtener una base de datos del recuento de trazos por carácter, podría ordenar fácilmente todos los caracteres, pero esto d Parece que no viene con Perl ni está encapsulado en ningún módulo que pueda encontrar.

Si sabe cómo clasificar CJK en otros idiomas, sería útil mencionarlo en una respuesta a esta pregunta.

+1

Esta es una pregunta tonta. "¿Cómo clasificas las palabras en chino?" o "¿Cómo clasificas las palabras coreanas?" tendría sentido, pero "¿Cómo clasificas los personajes de CJK?" no tiene ningún sentido. –

+0

Tiene mucho sentido, porque en la mayoría de los charmaps compatibles con varios idiomas asiáticos, el chino, el japonés y el coreano se agrupan en "CJK". – Andy

Respuesta

3

Consulte TR38 para ver los detalles sucios y las fundas de esquina. No es tan fácil como crees y como se ve esta muestra de código.

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. 

Ver http://en.wikipedia.org/wiki/List_of_Kangxi_radicals para una asignación de número ordinal radical al número de trazos.

+0

¿Sabes cómo usar el módulo Unicode :: Intercalar? Específicamente, ¿sabe cómo pasar un sub {} como el parámetro overrideCJK y hacer que se ejecute cuando se ejecute Unicode :: Collate-> sort()? Podría usar Unicode :: Unihan para obtener el recuento de trazos y la información radical para ordenar realmente los caracteres, pero la función overrideCJK no se ejecuta. – Neil

+1

No, pero puede [abrir una nueva pregunta] (http://stackoverflow.com/questions/ask) para ese tema. – daxim

+0

Considerando lo tonta que es la pregunta, una respuesta tan tonta como esto merece ser aceptada. No tiene sentido la noción de "clasificar personajes CJK". –

2

Un directorio telefónico japonés está ordenado en una base fonética (intercalación Gojûon). Sin embargo, el orden de los caracteres kanji no se basa en la fonética, ya sea en Unicode, JIS, S-JIS o EUC. Solo kana se basan en el orden fonético. ¡Esto significa que no puedes cotejar significativamente sin conversión fonética!

Por ejemplo:

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

Con b) oc), se puede hacer una especie significativa. Pero no puedes hacer con solo a). Por supuesto, puede ejecutar la función de ordenación simple, pero no es significativa para el japonés.

+0

Eso es responder a una pregunta sensata, "¿Cómo se clasifican las palabras en japonés?", Pero no responde la pregunta que realmente se hizo, por lo que no puedo votarlo mejor. –

+0

@Kinopiko: Yah, tengo que estar de acuerdo contigo. La pregunta original no es buena. – kmugitani

2

Mira mi rubygem aPinyin, que convertirá un carácter chino codificado en UTF-8 en su PinYin (pronunciación). Y luego, se podría hacer un tipo de cosas en los Pinyin fácilmente.

Simplemente, gem install toPinyin

require 'toPinyin' 

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

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

https://github.com/pierrchen/toPinyin

+0

¿Cómo obtuvieron los datos para esto? – Pacerier

Cuestiones relacionadas