Bienvenido a los foros de Perl en Español, Haidion.
¡Vaya problema!
El caso es que en un IRI puede venir casi cualquier carácter...
Según el RFC, serían los caracteres codificados como UCS siguientes:
Using text Syntax Highlighting
iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar
ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
/ %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
/ %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
/ %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
/ %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
/ %xD0000-DFFFD / %xE1000-EFFFD
iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Vamos, casi todos. Y además, puede venir en notación escapada ('%' con dos dígitos hexadecimales). O incluso en formato
punycode...
En la función as_iri(), del módulo
URI, hay una expresión regular para transformar la notación escapada a una cadena de caracteres Unicode puros.
Poco más se me ocurre...
Mírate el módulo
Mozilla::DOM::URI, que trae soporte para dominios internacionales. A lo mejor por ahí encuentras la solución.
Edito: EncontradoEdito 2: Mucho mejormás explicado (en inglés)