℞ 33: Longitud de la cadena en grafemasSi solo quiere aprender una cosa sobre Unicode, recuerde esto: los caracteres no son bytes, que no son grafemas, que no son códigos de carácter. Un símbolo visible para el usuario (un grafema) puede estar compuesto de múltiples códigos de carácter. Múltiples combinaciones de códigos de carácter pueden producir los mismos grafemas visibles para el usuario.
Para que quede completamente claro, sea cuidadoso y específico sobre lo que está intentando hacer en cada nivel.
Como ejemplo concreto, la cadena
brûlée tiene seis grafemas pero también hasta ocho códigos de carácter. Ahora suponga que quiere obtener su longitud. ¿Qué significa longitud? Si su cadena ha sido normalizada a una forma de un-grafema-por-código-de-carácter, length() es único y el mismo, pero considere esto:
Using perl Syntax Highlighting
use Unicode::Normalize;
my $str = "brûlée";
say length $str;
say length NFD( $str );
Coloreado en 0.011 segundos, usando
GeSHi 1.0.8.4
Para medir la longitud de una cadena contando por grafemas, pero no por códigos de carácter:
Using perl Syntax Highlighting
my $str = "brûlée";
my $count = 0;
while ($str =~ /\X/g) { $count++ }
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
De otra forma, (o en versiones anteriores de Perl), el módulo de CPAN
Unicode::GCString es muy útil:
Using perl Syntax Highlighting
use Unicode::GCString;
my $gcs = Unicode::GCString->new($str);
my $count = $gcs->length;
Coloreado en 0.011 segundos, usando
GeSHi 1.0.8.4
Artículo original (en inglés)