Página 1 de 1

Quitar acentos de una cadena de texto

NotaPublicado: 2008-05-08 21:00 @917
por hugo11ab
Que tal de nuevo requiriendo de su valiosa intervención.

¿Cómo puedo quitarle el acento a una cadena de texto? Aquí pongo un ejemplo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $nombre = "Martín González Gómes";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Quisiera que quedara así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$nombre = "Martin Gonzalez Gomez";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Habrá alguna manera de sustituir la vocal acentuada por la vocal sin acento?

NotaPublicado: 2008-05-09 02:09 @131
por explorer
Por fortuna, en Español tenemos pocos acentos y podemos hacer esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$nombre =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para cosas más complicadas, mejor usar Text::Unaccent::PurePerl.

NotaPublicado: 2008-05-09 10:02 @460
por hugo11ab
Gracias por tu pronta respuesta. La instrucción que me diste funcionó correctamente. Y de nuevo muchas gracias.

NotaPublicado: 2008-11-19 04:59 @249
por dgf
Hola,

Yo tengo el mismo problema, quiero quitar los acentos. He intentado con:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$nombre =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero me sustituye á por ae, é por ao, í por au, ó por au y u por au.
¿Alguien sabe por qué?

Muchas gracias

NotaPublicado: 2008-11-19 05:44 @281
por explorer
Bienvenido a los foros de Perl en Español, dgf.

Es cosa de la codificación del programa.

Por ejemplo. Yo estoy trabajando con Linux, en una terminal con codificación UTF8
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@joaquin:~> echo $LANG
es_ES.UTF-8
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Si ejecuto el programa en línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@joaquin:~> perl -le '$x = "Joaquín"; $x =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/; print $x'
Joaquaun
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
me sale el error que comentas. Esto es debido a que cada carácter acentuado que vemos en la variable $x está ocupando dos bytes en el programa. Y por eso tr() hace dos conversiones.

Hay que decirle a Perl que estamos manejando caracteres con codificación utf8, porque, por defecto, Perl piensa que siempre estamos con la codificación iso-8859-1 (latin1):
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@joaquin:~> perl -le 'use utf8; $x = "Joaquín"; $x =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/; print $x'
Joaquin
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si, en esa misma terminal, arranco un editor de textos, y le configuro para que trabaje con otra codificación, que sea la iso-8859-1, entonces
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $x = "Joaquín";

$x =~ tr/áéíóúüñçÁÉÍÓÚÜÑÇ/aeiouuncAEIOUUNC/;

print $x;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
genera también la salida correcta, debido a que todos los caracteres acentuados que hay dentro del programa están codificados de la misma manera y además pertenecen a la codificación predeterminada de Perl. Si estuviéramos codificando en otra distinta, deberíamos hacer conversiones con otro tipo de módulos, como por ejemplo Encode.

Debes mirar en qué codificación estás trabajando. O usar el módulo indicado antes.

NotaPublicado: 2008-11-20 02:52 @161
por dgf
Muchísimas gracias. Tenías razón, era problema de la codificación. Un saludo.