Perl – convertir ISO-8859-1 a UTF-8

perl-pdfPerl usa como codificación de caracteres a UTF-8 de forma predeterminada, sin embargo es común que perl tenga que interactuar con otros juegos de caracteres provenientes de fuentes de datos externos como archivos de texto, csv o bases de datos donde los caracteres sean representados típicamente en ISO-8859-1 también conocido como Latin1 si provienen de sistemas windows,colocándonos así en la tarea de tener que convertir ó transformar la codificación de los caracteres con los que estemos trabajando para así cumplir nuestros objetivos de programación.

El principal problema o dolor de cabeza de datos codificados en Latin1 presentes en entornos utf8 es la representación de caracteres especiales como (ñ y Ñ) y las letras acentuadas (con acentos) como [á,é,í,ó,ú,Á,É,Í,Ó,Ú,à,é,Á,É] que son mostrados con algo similar a: �.

El siguiente perl script usa el módulo Encode para transformar caracteres ISO-8859-1 provenientes de una base de datos MySQL a UTF-8, que para los efectos de esta entrada serán imprimidos por pantalla tanto la data original como la convertida en UTF-8.

#!/usr/bin/perl -w
use DBI;
use Encode;

$bd = DBI->connect("DBI:mysql:basededatos:host","usuario", "clave", { PrintError => 1}) || die $DBI::errstr;

$sth=$bd->prepare('SELECT * FROM noticias order by id asc limit 2000');
$sth->execute();

while(@consulta =$sth->fetchrow_array()){
print "id: ".++$incremeta_id;
print " Titulo original: ".$consulta[1]." - ";
print "Convertido UTF-8: ".encode('utf-8', $consulta[1])."\n";
}

print "\t\t\n $incremeta_id registros convertidos a UTF-8\n";

$sth->finish;

La función encode que vemos en la linea 13 recibe dos (2) parámetros. El primero el juego de caracteres que necesitamos y el segundo la cadena de texto (string) a realizar la conversión.

$utf8-string = encode("utf8", $string);
lenin@i5:~/Escritorio/convert$ time perl test-encode.pl
id: 1990 Titulo original: Se entreg� este a�o mil becas de Maestr�a y Doctorado – Convertido UTF-8: Se entregó este año mil becas de Maestría y Doctorado
id: 1991 Titulo original: Vecinos: “Grabaci�n aclara m�s la masacre” – Convertido UTF-8: Vecinos: “Grabación aclara más la masacre”
id: 1992 Titulo original: El inc�modo muerto – Convertido UTF-8: El incómodo muerto
id: 1993 Titulo original: Explosi�n de artefacto dej� tres heridos – Convertido UTF-8: Explosión de artefacto dejó tres heridos
id: 1994 Titulo original: Crudo repunt� a 26,60 d�lares por barril – Convertido UTF-8: Crudo repuntó a 26,60 dólares por barril
id: 1995 Titulo original: Peri�dico presentar� �Memoria – Convertido UTF-8: Periódico presentará “Memoria
id: 1996 Titulo original: Derechos del ni�o – Convertido UTF-8: Internet: Derechos del niño
id: 1997 Titulo original: Recolecci�n de basura – Convertido UTF-8: Recolección de basura
id: 1998 Titulo original: “No m�s cuentos” – Convertido UTF-8: “No  más cuentos”
id: 1999 Titulo original: GALER�A DE IM�GENES – Convertido UTF-8: GALERÍA DE IMÁGENES
id: 2000 Titulo original: Alcald�a entreg� donativo – Convertido UTF-8: Alcaldía entregó donativo
2000 registros convertidos a UTF-8
real 0m0.666s
user 0m0.052s
sys 0m0.020s
lenin@i5:~/Escritorio/convert$

Como resultado tenemos ya los caracteres legibles por pantalla, preparados para ser procesados, representados en otros medios ó almacenados en correcto UTF-8. El ejemplo fue realizado en Debian GNU-Linux.

Poblando SQLite con valores aleatorios en Python

programación lenguaje identacion python sqlite

Siguiendo esta entrada seremos capaces de poblar una tabla creada en SQLite, cuyos valores (usuario, nombre, apellido, password, cédula, fecha nacimiento, sexo, etc…) de cada campo serán generados de forma aleatoria, es decir seleccionando un valor de un arreglo o un rango determinado. El encargado de hacer todo esto será un sencillo script en python que recibe como argumento la cantidad de inserciones que le queremos realizar a la base de datos, lal cual creará el script en caso de que no exista. Este código fue escrito originalmente para probar las capacidades de carga y volumen de SQLite, fue adaptado a esta entrada con fines didácticos.

Por lo tanto esta sencilla práctica nos servirá básicamente entre otras cosas para:

  • Aprender a usar SQLite con Python (conexión, crear tabla y hacer insert).
  • Aprender a generar o seleccionar valores aleatorios con Python.
  • Aprender a pasar y recibir argumentos en un script Python.
  • Otros tips sobre Python.

 

Código Fuente


#!/usr/bin/python
# -*- coding: utf-8 -*-
# como usar: $time python test-sqlite.py 1000
import sys, datetime, sqlite3, hashlib
from random import *

db = sqlite3.connect("populate.sqlite")
dbconn = db.cursor()

crear_tabla = "CREATE TABLE IF NOT EXISTS usuarios( id_usuario INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, usuario varchar NOT NULL,"
crear_tabla = crear_tabla + "passwd VARCHAR NOT NULL, nombre VARCHAR NOT NULL, apellido VARCHAR NOT NULL, cedula VARCHAR NOT NULL,"
crear_tabla = crear_tabla + " fecha_nacimiento DATETIME NOT NULL, sexo char NOT NULL, perfil VARCHAR NOT NULL)"
str(dbconn.execute(crear_tabla))

list_nombre = ['Lenin','Ramiro','Alan','Rey','Elicer','Ana','Hugo','Ramon','Radames',
'Rosa','Dayana','Maria','Josefina','Pedro','Juan','Jose','Andres','Andrea']
list_apellido = ['Hernandez','Avalo','Rondon','Lima','Ponce','Gonzalez','Sifontes',
'Bello','Cardozo','Bermudez','Barreto','Fernandez','Delgado','Rodriguez']

if len(sys.argv) >= 2:
print "A continuacion se ingresaran ",sys.argv[1]," registros.";
else:
print "Este programa necesita el parametro de cantidad de registros a ingresar. Abortando Operacion.";
exit()

for i in range(int(sys.argv[1])):

fecha_nacimiento = datetime.datetime.today() - datetime.timedelta(days = randrange(1500, 25000))
nombre = choice(list_nombre)
apellido = choice(list_apellido)
cedula = str(randint(4000000, 21000000) )

sql = "INSERT INTO usuarios ('usuario','passwd','nombre', 'apellido', 'cedula', 'fecha_nacimiento', 'sexo', 'perfil') VALUES( "
sql = sql + "'" + nombre[0].lower() + apellido.lower() + "'"
sql = sql + ",'" + hashlib.md5(cedula).hexdigest() + "'"
sql = sql + ",'" + nombre +"','" + apellido + "'"
sql = sql + ",'" + cedula +  "'"
sql = sql + ",'" + fecha_nacimiento.strftime('%Y-%m-%d') + "'"
sql = sql + ",'" + choice(['M','F']) + "'"
sql = sql + ",'" + choice(['ADMIN','ANALISTA','CONSULTA']) + "')"

try:
dbconn.execute(str(sql))
print "Se ingreso correctamentente el registro Nº " + str(i+1) + ": " + nombre + " " + apellido
except:
print sql + "\n Ocurrio un error", "Guardando los datos del usuario."
exit()

db.commit()

Sigue leyendo