Re: Re: création de base en UTF8

From: "Daniel Verite" <daniel(at)manitou-mail(dot)org>
To: "Stephane Bortzmeyer" <bortzmeyer(at)nic(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Re: création de base en UTF8
Date: 2007-11-05 21:25:19
Message-ID: 2a4319ce-b872-4e55-bf06-2b5f7bfec559@mm
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Stephane Bortzmeyer wrote:

> Mes locales sont toutes en Latin-1, mes bases toutes en UTF-8 et je
> n'ai jamais rencontré de problèmes. Il "suffit" que client_encoding
> soit bien mis.

Ah je ne partage pas cet avis optimiste et j'opposerais à ça un test tout
simple ci-dessous :)

Serveur 8.1 debian etch, initdb --locale=fr_FR.iso88591
Environnement client: fr_FR.iso88591

postgres=# \l
Liste des bases de données
Nom | Propriétaire | Encodage
-----------+--------------+----------
postgres | postgres | LATIN1
template0 | postgres | LATIN1
template1 | postgres | LATIN1
(3 lignes)

postgres=# create database u8 encoding 'UTF8';
CREATE DATABASE
postgres=# \c u8
Vous êtes maintenant connecté à la base de données «u8».
postgres=# set client_encoding=latin1;
SET
u8=# select lower('à')
ERROR: invalid byte sequence for encoding "UTF8": 0xe3a0
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

Or mon client_encoding est tout à fait bon et mon terminal est bien LATIN1.

La raison de cette erreur pour moi est que la fonction lower() est dans un contexte
latin1 à cause de la locale coté serveur.
Elle voit les octets 0xc3,0xa0 (représentation UTF8 du a minuscule accent-grave)
Interprété en latin1, ça donne 2 caractères: A majuscule-tilde suivi de blanc-insécable
Dans ce contexte, le A majuscule-tilde est transformé en a minuscule-tilde (=0xe3) et le
blanc insécable reste tel quel.
Résultat: 0xe3,0xa0. C'est le résultat logique de lower() sur des octets supposés
représenter une chaine en LATIN1.
Problème: ce résultat n'est pas le même que ce qu'aurait produit lower() en
contexte UTF8, et d'ailleurs il n'est pas même valide du point de vue encodage,
d'où l'erreur générée par PG quand il essaie de le reconvertir en latin1 pour le
renvoyer au client.

--
Daniel
PostgreSQL-powered mail user agent and storage: http://www.manitou-mail.org

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Stephane Bortzmeyer 2007-11-06 08:45:32 Re: création de base en UTF8
Previous Message Stephane Bortzmeyer 2007-10-31 14:40:20 Re: création de base en UTF8