Página 1 de 1

Sort con 'ñ'

NotaPublicado: 2008-11-21 05:25 @267
por dgf
Hola otra vez,

Tengo un problema con la ñ. Trabajo en UTF8 y al hacer un sort ordena mal la ñ ¿Alguien sabe cómo puedo solucionarlo?

Muchas gracias

NotaPublicado: 2008-11-21 06:16 @303
por explorer
El tema de la codificación distinta de la de latin1 es compleja... deriva de cuando a alguien se le ocurrió crear una torre tan alta como para desafiar a Dios... y claro... cuando le haces enfadar, pasa lo que pasa... :)

Lo que debes hacer es indicar a Perl que tu programa está escrito en utf8:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use strict;
use warnings;
use diagnostics;

use utf8;
use locale;
use open OUT => ':locale';

my @x = split q{|}, "áéíóúüñçÁÉÍÓÚÜÑÇ";

print join q{},      @x;
print join q{}, sort @x;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
La salida es:
Código: Seleccionar todo
áéíóúüñçÁÉÍÓÚÜÑÇ
ÁÇÉÍÑÓÚÜáçéíñóúü

Y como ves, la 'ñ' se ha colocado correctamente entre la 'í' y la 'ó'. Y las mayúsculas antes que las minúsculas.

Para ser más estrictos, deberías poner siempre 'use locale' para indicar a Perl que debe usar la codificación de la terminal en la que se está ejecutando. Esto se refiere a la ordenación de las letras, para los operadores lógicos de comparación y otras (sort(), lc(), uc(), ...).

Otro ejemplo, con palabras:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
use utf8;
use locale;
use open OUT => ':locale';

@x = qw( coñe cuña cono cana coño cano cone coña caña cena cona cuna caño );

print join q{ },      @x;
print join q{ }, sort @x;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sale:
Código: Seleccionar todo
coñe cuña cono cana coño cano cone coña caña cena cona cuna caño
cana cano caña caño cena cona cone cono coña coñe coño cuna cuña