Vous êtes sur la page 1sur 9

Foro - Perl en Espaol

La comunidad de programadores en Perl de habla hispana.


Obviar
Portada
ndice general Mundo Perl Avanzado
Cambiar tamao de la fuente
Imprimir vista
FAQ
Registrarse
Identificarte

Publicidad

Problemas con y EBCDIC (Convert::IBM390)
Publicar una respuesta
7 mensajes Pgina 1 de 1
Problemas con y EBCDIC (Convert::IBM390)
por puchumx 2012-03-28 14:30 @645
Estimados:

Tengo un problema con Perl y las ""... El tema es as...

A travs de un perl genero un spool y lo paso a EBCDIC con la librera "Convert::IBM390". El tema es que cuando abro
los archivos con un editor de texto (ultraedit) las '' me figuran con "?".

Pas los archivos en modo binario. Adems, cuando me conecto desde sqlplus a Unix pasa lo siguiente:


Bsqueda avanzada
Buscar Buscar

Buscar este tema Buscar
Page 1 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html

(le quit algunos datos posiblemente sensibles por mi trabajo )

Por lo que pueden ver, parece ser un problema de las variables de entorno de Unix... El tema es que de Unix dicen que
est todo bien configurado... Adems, me genera bien el archivo si genero el mismo sin pasarlo a ebcdic (previo
seteo del nls_lang), pero cuando lo paso a ebcdic con la librera y despus lo paso a ascii nuevamente con el ultraedit,
me aparece el carcter "#".

Trabajo con Unix y tiene las siguientes variables seteadas:

locale:
LANG=en_US
LC_COLLATE="en_US"
LC_CTYPE="en_US"
LC_MONETARY="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_MESSAGES="en_US"
LC_ALL=

export(las que creo que son importantes)
LANG="en_US"
SHELL="/usr/bin/ksh"

Adems en el perl que genera el archivo tengo lo siguiente:
use POSIX qw/ strftime/; #permite usar strftime para tomar la fecha
use Convert::IBM390 qw(:all); #permite hacer la compresin
# Se setea el codepage requerido de EBCDIC
set_codepage('CP00284');
Page 2 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html

(entre otras cosas)

y la funcin que "comento" para que codifique en ebcdic o no es la siguiente:
open(ARCHIVO_SALIDA,">".$nombreArchivo)
or die("No se pudo crear el archivo: ".$nombreArchivo);

binmode ARCHIVO_SALIDA;

#Contador de registros escritos
my $cantidadRegistrosEscritos = 0;

while (my @array = $sth->fetchrow_array()) {
@array=packeb($formatoRegistro, @array);

print ARCHIVO_SALIDA @array; #imprimimos un array

if ($flagSeparador eq "SI") {
print ARCHIVO_SALIDA "\n"; #un separador de nueva lnea
}

$cantRegistrosEcritos++;

}
close(ARCHIVO_SALIDA);

Intent hacer lo que dice en este hilo, pero no result... Me dice que no puedo setear "locale". No s por qu...

Ayuda! Estoy desesperado ya... y encima no s nada de Perl...

Gracias de antemano...
puchumx
Perlero Nuevo


Mensajes: 13
Registrado: 2012-03-28 13:42 @612
Arriba
Re: Problemas con y EBCDIC (Convert::IBM390)
por explorer 2012-03-28 17:20 @764
Bienvenido a los foros de Perl en Espaol, puchumx.

Necesitaramos saber con qu Perl ests trabajando. Haz un perl -V

En la documentacin oficial de Perl hay un documento dedicado exclusivamente a EBCDIC, contando sus
particularidades (que son bastantes) (en tu propio ordenador, deberas poder leerlo localmente con el comando perldoc
perlebcdic)

Por lo que sale en la imagen, parece que si indicamos que queremos trabajar en ISO-8859-1, vemos la ''. Ya que no
conozco nada de EBCDIC, a lo mejor lo que voy a decir a continuacin es una tontera, pero, en cuestin de
codificaciones, no solo basta con saber en qu codificacin est trabajando la shell o los programas de aplicacin que
Publicidad

Page 3 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html
estamos usando (como las bases de datos), sino que, adems, hay que conocer la codificacin de la terminal en la que
estamos.

Eso quiere decir que, a lo mejor, en la primera consulta que haces, al ver los caracteres '?', resulta que s es la letra '',
pero en una codificacin que es distinta de la codificacin en la que est trabajando la terminal. Cuando lo cambias
NLS_LANG a iso-8859-1, y sale en pantalla, la vemos porque Oracle en ese momento sabe la codificacin en la que
estamos trabajando (la aplicacin de usuario Y la terminal).

Setting the NLS_LANG environment parameter is the simplest way to specify locale behavior for Oracle software. It
sets the language and territory used by the client application and the database server. It also indicates the client's
character set, which corresponds to the character set for data to be entered or displayed by a client program. FAQ

Las variables de entorno Unix que sacas nos dicen que ests en en_US para el 'collating' (ordenacin de letras), pero no
nos dicen nada de la codificacin, as que estarn tomando la de por defecto del sistema.

As que... en qu estamos trabajando en el sistema? En EBCDIC o en otra codificacin?

En el perlebcdic tienes ejemplos de cmo usar (a partir de Perl v5.8) el mdulo Encode para pasar de una codificacin a
otra, que puedes usar tambin a parte de Convert::IBM390.

Una cosa: dices que el problema est a la hora de abrir el fichero con el Ultraedit, que no salen bien los caracteres. En
qu codificacin est el Ultraedit en ese momento? (Men Ver->Cambiar codificacin) A lo mejor puedes cambiar a
una correcta y entonces sabrs en qu codificacin est realmente el archivo.
JF^D Perl programming

explorer
Administrador


Mensajes: 11459
Registrado: 2005-07-24 18:12 @800
Ubicacin: Valladolid, Espaa
Arriba
Re: Problemas con y EBCDIC (Convert::IBM390)
por puchumx 2012-03-29 08:47 @408
Genio, gracias por responder y por la bienvenida.

Te comento: estoy trabajando con la versin 5.8 de Perl. La codificacin del UltraEdit que estaba usando era la "1252
(ANSI - Latn I)" (ahora la pas a "28591 (ISO 8859-1 Latn I)") pero no funcion.

Usamos la librera Convert::IBM390 y est bien configurada (aparentemente, es la correcta, la 284), as que tendra que
leer cmo combinarla con la "Encode"...

Algo que me llamo la atencin es lo que est seteado en la base de datos, que no corresponde a lo de Unix (no s si por
ah viene el problema):

Using text Syntax Highlighting


NLS_LANGUAGE: LATIN AMERICAN SPANISH
NLS_DATE_LANGUAGE: LATIN AMERICAN SPANISH
NLS_CHARACTERSET: WE8ISO8859P1
NLS_SORT: SPANISH
Sintxis: [ Descargar ] [ Ocultar ] [ Seleccionar ] [ Expandir ]
Page 4 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html
En cambio en Unix dice que estoy en "US", cuando debera estar en "ES", no?

Using text Syntax Highlighting


Tambin me llama mucho la atencin lo siguiente:
* CON LNS_LANG no seteado
Sin comprimir -> = ?
Usando Convert::IBM390, y Uedit de EBCDIC a ascii -> = ?

* CON LNS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
Sin comprimir -> =
Usando Convert::IBM390, y Uedit de EBCDIC a ascii -> =# , =|

Desde Unix me dicen que est todo bien, que el charset est funcionando bien y que ISO8859-1 es la configuracin...


Voy a leer lo que me pasaste de la documentacin oficial de Perl a ver qu encuentro!

Ah!, intent setear la variable LC_ALL para decirle a Perl que estoy usando caracteres espaoles, pero al setearlo en el
perl as:

use POSIX qw(locale_h);
setlocale(
LC_ALL,
"es_ES.ISO-8859-1"
)
or die "Fallo al setear la variable LC_ALL";

al correr el perl, en Unix me figura:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LC_ALL = "es_ES.ISO-8859-1",
LC__FASTMSG = "true",
LANG = "en_US"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").


Gracias explorer!
puchumx
Perlero Nuevo


Mensajes: 13
Registrado: 2012-03-28 13:42 @612
Arriba
Re: Problemas con y EBCDIC (Convert::IBM390)
por explorer 2012-03-29 11:11 @508
puchumx escribiste:estoy trabajando con la versin 5.8 de Perl.
Pero, cul? La v5.8.0, la v5.8.8...? Es que de una versin a otra s que pueden cambiar mucho las cosas, sobre todo en
el tema de codificaciones.

LANG=en_US
LC_COLLATE="en_US"
LC_CTYPE="en_US"
LC_MONETARY="en_US"
Sintxis: [ Descargar ] [ Ocultar ] [ Seleccionar ] [ Expandir ]
Page 5 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html
puchumx escribiste:La codificacin del UltraEdit que estaba usando era la "1252 (ANSI - Latn I)" (ahora
la pas a "28591 (ISO 8859-1 Latn I)") pero no funcion.
Se trata de "Ver" en qu codificacin est. Si no es con ninguna de esas, pues hay que seguir probando. Yo, en Linux,
cuando no s qu es lo que estoy viendo, uso un volcado hexadecimal para "ver los bytes":
Using text Syntax Highlighting
Aqu ya veo que los caracteres tildados ocupan dos bytes, y que todos ellos comienzan con el byte 0xc3, as que esto es
un archivo escrito en UTF8.

Tambin suelo usar el comando 'file':
Using text Syntax Highlighting
explorer@casa:/media/500_1/home/explorer/Documentos/Desarrollo> file
donquijoteparrafo1.txt
donquijoteparrafo1.txt: UTF-8 Unicode text
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Es ms rpido

Bueno, pues si no es iso-8859-1 ni la latin1 versin 1252 de Windows, ser otra (sospecho que puede ser EBCDIC )

puchumx escribiste:Usamos la librera Convert::IBM390 y est bien configurada (aparentemente, es la
correcta, la 284), as que tendra que leer cmo combinarla con la "Encode"...
Pues si funciona bien, djala como est.

puchumx escribiste:Algo que me llam la atencin es lo que est seteado en la base de datos, que no
corresponde a lo de Unix (no s si por ah viene el problema):
...
En cambio en Unix dice que estoy en "US", cuando debera estar en "ES", no?
Bueno, entre la versin espaola y la norteamericana, hay unas diferencias, como el 'collating' (ordenacin), fechas,
horas, caracteres de separacin de los millares y decimales... Pero esto se refiere a la localizacin (particularidades de
cada pas). Estbamos hablando de la codificacin (tabla de caracteres).

puchumx escribiste:Tambin me llama mucho la atencin lo siguiente:
* CON LNS_LANG no seteado
Sin comprimir -> = ?
Usando Convert::IBM390, y Uedit de EBCDIC a ascii -> = ?
Bien... no es ASCII... Qu es? Qu byte(s) es/son?

puchumx escribiste:* CON LNS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
Sin comprimir -> =
Usando Convert::IBM390, y Uedit de EBCDIC a ascii -> =# , =|
La variable de entorno NLS_LAG (que no LNS_LANG) le indica a Oracle que nuestra aplicacin/terminal trabaja en
esa codificacin, as que suponemos que entregar el resultado en esa codificacin. Si nuestra terminal tambin est en
is-8859-1, por eso podemos ver bien la '' en pantalla. Otra cosa es lo que hace nuestro programa: seguro que sabe que
ahora los datos que recibe desde la base de datos estn en iso-8859-1?

puchumx escribiste:Desde Unix me dicen que est todo bien, que el charset est funcionando bien y que
ISO8859-1 es la configuracin...
Bueno, pues ya tenemos una pista ms.

puchumx escribiste:Ah!, intent setear la variable LC_ALL para decirle a Perl que estoy usando caracteres
espaoles, pero al setearlo en el perl as:

use POSIX qw(locale_h);
explorer@casa:/media/500_1/home/explorer/Documentos/Desarrollo> hexdump -C
donquijoteparrafo1.txt
00000000 45 6e 20 75 6e 20 6c 75 67 61 72 20 64 65 20 6c |En un lugar de l|
00000010 61 20 4d 61 6e 63 68 61 2c 20 64 65 20 63 75 79 |a Mancha, de cuy|
Sintxis: [ Descargar ] [ Ocultar ] [ Seleccionar ] [ Expandir ]
Sintxis: [ Descargar ] [ Ocultar ]
Page 6 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html
setlocale(
LC_ALL,
"es_ES.ISO-8859-1"
)
or die "Fallo al setear la variable LC_ALL";

al correr el perl, en Unix me figura:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LC_ALL = "es_ES.ISO-8859-1",
LC__FASTMSG = "true",
LANG = "en_US"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Eso quiere decir que en ese sistema no estn instaladas las tablas de localizacin para es_ES.ISO-8859-1. Debers pedir
a los administradores que las instalen.

Lo tienes comentado en perllocale, seccin Permanently fixing your system's locale configuration.
JF^D Perl programming

explorer
Administrador


Mensajes: 11459
Registrado: 2005-07-24 18:12 @800
Ubicacin: Valladolid, Espaa
Arriba
Re: Problemas con y EBCDIC (Convert::IBM390)
por puchumx 2012-03-29 12:35 @566
Wow! Cuanta info! ja,ja,ja! Gracias, explorer, voy a seguir probando a ver cmo sigo y cuento por ac cmo lo
arregl!

Cualquier duda nueva que me surja la posteo ac

Gracias de nuevo!!!
puchumx
Perlero Nuevo


Mensajes: 13
Registrado: 2012-03-28 13:42 @612
Arriba
Re: Problemas con y EBCDIC (Convert::IBM390)
por puchumx 2012-04-03 14:57 @664
Bueno, encontr una solucin
Page 7 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html

Paso a ponerla ac por si a alguno le sirve.

Pasos:
1) Como al ejecutar el spool sin usar la librera Convert::IBM390 (para pasar de ascii a ebcdic y viceversa), tuve que
setear la variable NLS_LANG y exportarla en unix as:

export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

2) En esta pgina: http://www.tachyonsoft.com/cp00037.htm (perdn si no se puede, pero est buena para buscar los
cdigos ascii, entre otros) encontr los cdigos ascii/ebcdic de cada carcter. (Si le cambias el cp00037 por el que
quieras tenes otros juegos de codepages.)

3) Abr con un editor de texto el cp00037 que tengo instalado en unix y me abra una serie de nmeros ordenados en
columnas y filas (esos son los cdigos ascii que despus la librera va a traducir dependiendo su posicin...) Es algo as:

Using perl Syntax Highlighting


4) Hice un update sobre la base de datos sobre un campo string con varios de los caracteres "raros" del codeset 037
(estim que ese estaba instalado en el mainframe del IBM) y la mayora me daba los mismos, pero otros me los
cambiaba... He aqu que la '' y la '' estaban, pero en la BD eran otros caracteres.

5) Me fij en la pgina los caracteres que tena en la base de datos que se correspondan con la '' y '' en las bajadas
que generaba e intercambi sus cdigos ascii en la tabla de arriba (use el codeset ISO-8859-1 porque era el que estaba
instalado en unix, segn mi admin unix)

6)"Voal"... Ya me imprima las ''...

Disculpen la mala redaccin o si algo no est bien explicado, es solo para que vean cmo lo solucion y que sirva como
gua a alguien ms... Saludos y gracias explorer por tu ayuda!!
puchumx
Perlero Nuevo


Mensajes: 13
Registrado: 2012-03-28 13:42 @612
Arriba
Re: Problemas con y EBCDIC (Convert::IBM390)
por explorer 2012-04-03 16:16 @719
Creo que has relatado lo que hace Encode

Es decir, si supiramos en qu codificacin est el origen, y como sabemos que debemos pasarlo a iso-8859-1, entonces
toda la transformacin se hace en un paso con from_to().

De todas formas, enhorabuena. Apuntado queda.
1. sub import {
2. set_translation(undef, <<'END EBCDIC');
3. 00 01 02 03 9C 09 86 7F 97 8D 8E 0B 0C 0D 0E 0F
4. 10 11 12 13 9D 0A 08 87 18 19 92 8F 1C 1D 1E 1F
JF^D Perl programming
Sintxis: [ Descargar ] [ Ocultar ] [ Seleccionar ] [ Expandir ]
Page 8 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html

explorer
Administrador


Mensajes: 11459
Registrado: 2005-07-24 18:12 @800
Ubicacin: Valladolid, Espaa
Arriba
Publicar una respuesta
7 mensajes Pgina 1 de 1
Volver a Avanzado
Quin est conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados
ndice general
El Equipo Borrar todas las cookies del Foro Todos los horarios son UTC - 6 horas [ DST ]
Powered by phpBB Forum Software phpBB Group
Traduccin al Espaol Mexicano por nextgen en colaboracin con phpbb-es.com
phpBB SEO
Advertisements by Advertisement Management
Mostrar mensajes previos: Ordenar por
Todos los mensajes Fecha publicacin Ascendente Ir
Saltar a:
Avanzado Ir
Page 9 of 9 Problemas con y EBCDIC (Convert::IBM390) : Avanzado
01/04/2013 http://perlenespanol.com/foro/problemas-con-n-y-ebcdic-convert-ibm390-t7072.html

Vous aimerez peut-être aussi