RE: unicode xml

From: "Cristian Carrasco" <Cristian(dot)Carrasco(at)telematica(dot)net>
To: "Gunnar Wolf" <gwolf(at)gwolf(dot)org>, "Alvaro Herrera" <alvherre(at)alvh(dot)no-ip(dot)org>, <ities(at)gwolf(dot)org>, "&#x8A9E;n" <decode_entities'(at)gwolf(dot)org>
Cc: "Guido Barosio" <gbarosio(at)gmail(dot)com>, "pgsql-es-ayuda" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: unicode xml
Date: 2008-11-26 14:23:54
Message-ID: E25768D51C2C694FB9BBB03140ADC12902E598D1@tmexch1.telematica.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Realice pruebas en estructuras de XML de este tipo

Id Valor
1 <俄語>Китайский</俄語>
2 <hola><俄語>Китайский</俄語></hola>
3 <俄><俄語>Китайский</俄語></俄>
4 <俄><俄語>俄</俄語></俄>
5 <hola>Китайский</hola>
6 <hola>俄語</hola>

Estos valores pudieron ser almacenados sin problemas mediante insert directos en tabla. Se realizo pruebas de búsqueda de caracteres especiales

Búsqueda de valor Китайский:

Prueba 01
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'/俄語[text()="Китайский"]')
Resultado:
Error Path

Prueba 02
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'/hola[text()="Китайский"]')
Resultado:
5 <hola>Китайский</hola>
Diferente al caso anterior, donde no tomo el valor en chino como tag

Prueba 03
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'//俄語[text()="Китайский"]')
Resultado:

1 <俄語>Китайский</俄語>
2 <hola><俄語>Китайский</俄語></hola>
3 <俄><俄語>Китайский</俄語></俄>

Prueba 04
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'./俄語[text()="Китайский"]')
Resultado:

2 <hola><俄語>Китайский</俄語></hola>
3 <俄><俄語>Китайский</俄語></俄>

Prueba 05
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'../俄語[text()="Китайский"]')
Resultado:

1 <俄語>Китайский</俄語>

Prueba 06
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'*[text()="Китайский"]')
Resultado:

2 <hola><俄語>Китайский</俄語></hola>
3 <俄><俄語>Китайский</俄語></俄>

Búsqueda de valor 俄:

Prueba 01
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'//俄語[text()="語"]')
Resultado:
4 <俄><俄語>俄</俄語></俄>

Prueba 02
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'../俄語[text()="語"]')
Resultado:
Vacio

Prueba 03
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'./俄語[text()="語"]')
Resultado:
4 <俄><俄語>俄</俄語></俄>

Prueba 04
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'*[text()="語"]')
Resultado:
4 <俄><俄語>俄</俄語></俄>

Búsqueda de valor 俄語:

Prueba 05
SELECT * FROM xml_prueba where xpath_bool(cast("dato" as text),'/hola[text()="俄語"]')
Resultado:
6 <hola>俄語</hola>

Atte.
Cristián J. Carrasco Gómez

-----Mensaje original-----
De: Gunnar Wolf [mailto:gwolf(at)gwolf(dot)org]
Enviado el: Martes, 25 de Noviembre de 2008 16:57
Para: Alvaro Herrera; ities(at)gwolf(dot)org; &#x8A9E;n
CC: Guido Barosio; Cristian Carrasco; pgsql-es-ayuda
Asunto: Re: [pgsql-es-ayuda] unicode xml

Alvaro Herrera dijo [Tue, Nov 25, 2008 at 03:10:56PM -0300]:
> > > Valor
> > > 为到地和ñ
> > > (...)
> > > Aquí el valor desplegado es algo como esto: &#x8A9E;/g& bla bla bla
>
> Guido Barosio escribió:
> > Cristian,
> >
> > Huele a encoding del cliente, consideraste eso?
>
> El codigo XML hace sus propias conversiones de codificación :-( Me
> pregunto si se estará mareando por eso.
>
> Ahora, lo otro es que &#x8A9E; parece sospechosamente HTML, así que la
> otra posibilidad es que la contaminación venga de otra capa, externa a
> Postgres.

No tengo idea de si con "&#x8A9E;/g& bla bla bla" estás citando
literalmente lo que te da ante tu cadena, pero eso parece una
representación válida de un ideograma oriental. La notación
"&#x(hexa); indica que el transporte HTTP puede haber especificado una
codificación más baja que UTF, pero el contenido va representando los
codepoints Unicode indicados. Puedes hacer la prueba, por ejemplo, con
el módulo de Perl HTML::Entities:

$ perl -e 'use HTML::Entities; print HTML::Entities::decode_entities("&#x8A9E;\n")'
Wide character in print at -e line 1.

Claro, te está advirtiendo de que puede que a tu terminal no le guste
ese caracter (lo del "Wide character")... Pero funciona
correctamente. Si quieres ver varios caracteres de la familia
consecutivos:

$ perl -e 'use HTML::Entities; for my $num (0..15) { $chr .= sprintf("&#x8A9%x;", $num); } print HTML::Entities::decode_entities($chr) '
Wide character in print at -e line 1.
誐誑誒誓誔誕誖誗誘誙誚誛誜誝語誟

(Nota: Puede que _mi_ mensaje no se vea bien... No estoy seguro de que
este entorno se lleve con el Unicode que estoy escribiendo)

--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Fernando Hevia 2008-11-26 14:30:45 RE: Recorrer un Refcursor
Previous Message Alvaro Herrera 2008-11-26 14:23:15 Re: Tamaño de un varchar en la base de datos.