erv-Z, estás confundido en varias cosas...
Primero, el
sistema alfanumérico que has enlazado de la Wikipedia es un sistema numérico, como bien dice en la primera frase. NO tiene nada que ver con lo que se entiende como
Alfanumérico: «
Un término informático que hace referencia al conjunto de caracteres numéricos y alfabéticos de los cuales dispone una computadora. Tiene una correspondencia casi exacta con los caracteres que aparecen en un teclado de ordenador». Eso quiere decir que una letra, incluso la 'ñ', es un carácter alfanumérico. Y da igual que no esté en los alfabetos anglosajones: sí está en nuestro
alfabeto latino occidental.
Lo que ocurre es que Perl, por defecto, aunque trabaja con iso-8859-1, y la 'ñ' está en la posición 241 y 209 (minúscula y mayúscula), es un carácter que solo es propio de las localizaciones latinas. Por eso hay que indicar a Perl la localización en la que estamos trabajando, y así saber cuáles son letras normales y cuáles no.
Segundo, en las expresiones regulares, con solo '[a-z]', estamos indicando solo ese rango, pero nada más. En cambio, tal como lo indica en
perlre, cuando ponemos '\w' o '[:alnum:]' sí que estamos buscando por caracteres alfanuméricos según la localización que tengamos activa en ese momento.
He preparado un programa para que veas que la 'ñ' sí que es una letra alfanumérica:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
no locale; # Trabajar sin localización -configuración por defecto-
print +( # Listado de los primeros 256 caracteres
sort grep /\w/, # Nos quedaremos solo con los alfanuméricos
map { chr } 0..255
), "\n";
use POSIX qw(locale_h); # Vamos a indicar una localización
setlocale(
LC_ALL, # Todas las opciones de localización serán cambiadas a
"es_ES.ISO-8859-1" # Español, en alfabeto iso-8859-1
)
or die "Perdón";
use locale; # Indicamos que queremos usar nuestra localización
# en las próximas expresiones regulares
print +(
sort grep /\w/, # Nos quedaremos solo con los alfanuméricos
map { chr } 0..255
), "\n";
my $letra = chr 0xf1; # Solo la 'ñ' en codificación iso-8859-1, la de por defecto de Perl
es_alfanumerico( $letra );
use utf8; # La 'ñ' que viene a continuación está escrita en un editor
# de textos con codificación utf-8, así que debemos indicar
# a Perl que lo que sigue no son dos bytes, sino un solo carácter
use open 'locale'; # A la hora de pintarlo, también queremos que salga como utf-8,
# ya que así también está la terminal en la que estamos trabajando
es_alfanumerico( 'ñ' ); # 'ñ' codificada dentro del programa (literal)
es_alfanumerico( "\x{00F1}" ); # Codificación unicode de la 'ñ'
es_alfanumerico( "\N{U+00F1}" );# Otra codificación unicode
use charnames ':full'; # Codificación de caracteres especiales mediante 'escapes'
es_alfanumerico( "\N{LATIN SMALL LETTER N WITH TILDE}" ); # Otra 'ñ'
es_alfanumerico( "\N{VICTORY HAND}" ); # ¡Victoria!
es_alfanumerico( "\N{WHITE SMILING FACE}" ); # :)
sub es_alfanumerico {
my $letra = shift;
print "[$letra] ";
if ($letra =~ m/\w/) { # También valdría m/[[:alnum:]]/
print 'Sí';
}
else {
print 'No';
}
print "\n";
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
La salida es:
Using text Syntax Highlighting
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
_µÐð0123456789aAªáÁàÀâÂåÅäÄãÃæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIíÍìÌîÎïÏjJkKlLmMnNñÑoOºóÓòÒôÔöÖõÕøØpPqQrRsSßtTþÞuUúÚùÙûÛüÜvVwWxXyYýÝÿzZ
[ñ] Sí
[ñ] Sí
[ñ] Sí
[ñ] Sí
[ñ] Sí
[✌] No
[☺] No
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Observaciones:
- En las líneas 6 a 10 es la configuración por defecto de Perl, y como puedes ver, el alfabeto de lo que él entiende como alfanumérico es justo [0-9A-Z_a-z], todo muy inglés...
. - De las líneas 13 a 25 indicamos que vamos a trabajar con el alfabeto ISO-8859-1 -el de por defecto de Perl-, PERO con la localización española ('es_ES'). El resultado es la segunda línea de la salida: un montón de caracteres más se han sumado a la familia de los alfanuméricos. Incluso están las abreviaturas primero (º) y primera (ª).
. - En la línea 28 probamos exclusivamente con una cadena de caracteres que contenga solo un byte 0xf1 (la codificación de 'ñ' en iso-8859-1. Como es la que estamos usando en este momento, pues nos indica que sí, que es alfanumérico.
. - Las líneas 31 a 38 pueden ser algo complicadas de entender para quien no sepa lo que es trabajar con distintas codificaciones. Resulta que yo, desde hace ya unos pocos años, trabajo en mis máquinas con codificación utf-8, tanto en terminales como en editores de texto y los ficheros que generan. El programa anterior lo estoy escribiendo en un editor con codificación utf-8. Si, dentro del programa, escribo, literalmente, una 'ñ', estaré escribiendo una cadena de texto con dos bytes (0xc3 y 0xb1) que codifican a la eñe en la codificación utf-8, pero Perl NO LO SABE. Para Perl, son dos bytes que codifican a dos caracteres, ya que sigue trabajando por defecto en la ISO-8859-1. Debo advertir a Perl que lo que va a ver a continuación no son dos bytes, sino solo un carácter, codificado en utf-8. La línea 31 indica eso: que los bytes que va a encontrar en las cadenas de texto estarán en utf-8. Y la línea 35 indica que, a la hora de imprimir esos caracteres, lo haga en la localización que indique el sistema (el sistema está puesto a es_ES.UTF-8), por lo que Perl no emitirá caracteres en ISO-8859-1, sino en utf-8.
. - Las líneas 41 a 48 es para mostrar otra forma de indicar caracteres especiales, también en Unicode.
Resumen: Nuestra eñe será alfanumérica si Perl sabe en qué parte del planeta estamos trabajando.