JDBC, SQL Serveur et Unicode

JDBC, SQL Serveur et Unicode - Java - Programmation

Marsh Posté le 05-11-2004 à 16:59:16    

Je suis en train de mettre en place un système de traduction d'une appli web écrite en Java (Servlet / JSP).
base de donnée qui fait les correspondances suivantes :
ID Message + ID Langage => Libellé
Avec les langues qui ont un alphabet latin, tout roule.
Par contre, quand on veut traduire en Hébreux, Arménien, Japonais, etc... ça pose problème.
La colone de libellé est de type nvarchar (contient donc de l'Unicode, ce qui permet d'y mettre aussi bien des caractères latins que des caractères hébreux, japonais ou autre, sans se soucier du charset).
Le problème, c'est que, quand je tente de récupérer la valeur de ce champ, s'il contient des caractères latin, ça roule. Par contre, si j'y écrit des caractères hébreux ou autre, quand j'appelle le getString sur la colone concernée, je ne récupère que des ? et de espaces. Idem, si je récupère un tableau de byte, il contient les codes ascii de ? et d'espaces.
Des idées ?

Reply

Marsh Posté le 05-11-2004 à 16:59:16   

Reply

Marsh Posté le 06-11-2004 à 17:33:00    

quel db/driver?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 06-11-2004 à 17:33:28    

(j'ai eu le probleme avec mysql, et en fait il faut spécifier l'encoding dans l'url de connection qu'on passe au driver jdbc)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 06-11-2004 à 17:47:12    

euh bon, SQLServer, donc...
exemple, avec les drivers altinav:
http://www.atinav.com/products/ave [...] htm#feat17
(euh par contre faudra m'expliquer pourquoi ils veulent mettre des guillemets dans leurs urls, mais bon, passons)
 
autre driver, je sais pas de qui:
http://www.inetsoftware.de/English [...] Converting
 
bref, t'as pigé, va voir les docs de ton driver :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 08-11-2004 à 15:57:48    

Non, mais ce que je voudrais moi, c'est pouvoir stocker aussi bien des caractères chinois, hébreux, arménien, latins, etc, tout ça dans un même champ. Pour ça, nvarchar va m'etre utile.
En fait il permet de s'affranchire de l'encoding habituel, et de tout stocker en unicode.
A mon avis, l'option "encoding" à laquelle tu fais référence correspond à la propriété "charset" de mon driver :
http://jtds.sourceforge.net/faq.html
 
Voila une petite copie du passage qui nous interresse :


charset (default - the character set the server was installed with)
    Very important setting, determines the byte value to character mapping for CHAR/VARCHAR/TEXT values. Applies for characters from the extended set (codes 128-255). For NCHAR/NVARCHAR/NTEXT values doesn't have any effect since these are stored using Unicode.


 
PS : désolé si je dis des conneries, mais je m'y perd un peu dans tout ça, ces histoires d'encodage, d'unicode, UTF-8, et tout ça.

Reply

Marsh Posté le 08-11-2004 à 16:45:11    

essaie quand meme
et puis niveau client, il faut aussi lui dire quel est ton encodage, pas lui rebalancer tout ds la gueule pour qu'il devine

Reply

Marsh Posté le 08-11-2004 à 17:24:26    

En fait je crois que j'ai compris.
SQL Server permet de stocker des caractères unicode, à l'aide de l'UCS-2
En Java, les caractères sont codés en unicode aussi, mais suivant la norme UTF-16.
D'ou problème quand j'essaye de stocker des caractères spéciaux depuis mon code Java, dans ma base de données SQL erver. (et pb dans l'autre sens aussi).
Il faudrait que j'arrive à convertir les bytes de ma chaines de char en UCS-2. Problème : la classe Charset n'inclus pas l'interprétation de l'UCS-2 en standard. :-(
 
(extrait de Javadoc : type d'encodages supportés en standard)


US-ASCII   Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set
ISO-8859-1    ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
UTF-8  Eight-bit UCS Transformation Format
UTF-16BE  Sixteen-bit UCS Transformation Format, big-endian byte order
UTF-16LE  Sixteen-bit UCS Transformation Format, little-endian byte order
UTF-16


Message édité par El_gringo le 08-11-2004 à 17:24:35
Reply

Marsh Posté le 08-11-2004 à 17:32:31    

UCS2? [:mlc]
 
 
tu sais quoi? utilise un bete varchar et utilise le param dont tu me parlais plus haut [:joce]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-11-2004 à 09:23:24    

impossible. Avec un bête varchar, je peux pas faire d'unicode, donc pas d'idéogrammes chinois je crois, et en tout cas, je suis sur que je n'pourrais pas mettre ET des idéogrammes chinois ET des caractères hébreux, etc. Avec un varchar, on se limite à un charset particulier.

Reply

Marsh Posté le 09-11-2004 à 09:24:46    

Brêve description des normes d'unicode :
http://alis.isoc.org/glossaire/unicode.fr.htm

Reply

Marsh Posté le 09-11-2004 à 09:24:46   

Reply

Marsh Posté le 09-11-2004 à 10:43:09    

El_gringo a écrit :

impossible. Avec un bête varchar, je peux pas faire d'unicode, donc pas d'idéogrammes chinois je crois, et en tout cas, je suis sur que je n'pourrais pas mettre ET des idéogrammes chinois ET des caractères hébreux, etc. Avec un varchar, on se limite à un charset particulier.

t'as essayé? pq tu pourrais pas encoder de l'unicode dans un varchar? :o

Reply

Marsh Posté le 09-11-2004 à 12:53:06    

Ben, c'est comme ça, j'y peux rien moi.
CF (voir varchar et nvarchar) :  
http://www.laltruiste.com/document [...] erver.html

Reply

Marsh Posté le 09-11-2004 à 13:00:32    

je te parle d'encodage, pas des types natifs d'sqlserver.
 
re-t'as essayé ?

Reply

Marsh Posté le 09-11-2004 à 13:03:29    

J'avoue, j'ai pas essayé...
 
J'vais manger un bout et j'essaye. Je vous (te) tiens au courant.

Reply

Marsh Posté le 09-11-2004 à 13:06:33    

:D

Reply

Marsh Posté le 09-11-2004 à 14:04:02    

Un petit post, juste pour dire que j'ai tjs pas essayé du varchar, mais voici sur jguru un problème qui semble être le même que le mien. Sans réponse ! :-(  
http://www.jguru.com/faq/view.jsp?EID=114155


Message édité par El_gringo le 09-11-2004 à 14:04:16
Reply

Marsh Posté le 10-11-2004 à 08:58:56    

Au fait, j'ai essayé avec du varchar. Le problème est le même. Par contre j'arrive à un meilleur résultat en insérant mes données de cette manière (voir le N avant les données) :

String sql = "insert into D_TRANSLATE VALUES ('test.unicode', 'test.unicode', 'UNI',N'" + unicode + "')";


 
Ce problème est donc résolu. Mais, ho ho, 'faudrait pas que je me croie tiré d'affaire moi ! :-/
 
Voir la suite ici :
http://forum.hardware.fr/forum2.ph [...] 0&subcat=0

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed