2009-09-10 7 views
2

Ma base de données (10gR2) est un octet (NLS_CHARACTERSET = WE8DEC).Conversion aisée d'Unicode en un jeu de caractères à un octet

J'ai un fichier XML Unicode que je voudrais analyser. Si je lis le fichier dans un CLOB et essaie de le convertir en XMLType, Oracle s'étouffe lorsque le XML contient des caractères spéciaux (dans ce cas, des caractères norvégiens tels que "øæå").

ORA-31011: XML parsing failed 
ORA-19202: Error occurred in XML processing 
LPX-00216: invalid character 184 (0xB8) 

Si je lis le fichier dans un NCLOB, puis convertir explicitement à un CLOB en utilisant TO_CLOB, le constructeur de XMLType réussit. Cependant, cette conversion produit des résultats "laids". Par exemple,

bølle gjær 

devient

bÿlle gjÿr 

Est-il possible que je peux effectuer la conversion de NCLOB avec Unicode pour CLOB un seul octet et de toujours garder les caractères spéciaux intacts? (Je suis particulièrement intéressé par la conversion correcte des trois caractères norvégiens "øæå", les autres symboles et caractères spéciaux ne sont pas importants dans ce cas.)

Répondre

1

Il peut être possible de réencoder les caractères qui ne correspondent pas en un octet en utilisant des références de caractères. Cela peut être fait en recherchant la valeur unicode en le plaçant dans une référence. Par exemple, A ressemblerait à A

1

TO_CLOB est censé convertir du jeu de caractères national au jeu de caractères de base de données correctement. Vous n'aurez aucun problème si tous les caractères peuvent être mappés.

Je soupçonne alors que votre problème se produit dans le lire le fichier dans la partie NCLOB. Unicode est une information assez vague:

  • fichiers XML sont très souvent codés dans le jeu de caractères UTF-8 (avec ou sans Byte Order Mark).
  • Le jeu de caractères nationaux est défini sur UTF-16 (AL16UTF16) sur Oracle par défaut.

Une conversion spécifique est nécessaire pour passer de l'un à l'autre. Vous devez d'abord vous assurer que le fichier NCLOB contenant votre fichier XML contient les informations correctes.

0

Je ne connais pas la réponse exacte à votre question, mais cette technique peut vous être utile pour commencer.

Voici une requête que j'utilise pour convertir un jeu de caractères en un autre.

SELECT CONVERT(NAME, 'WE8ISO8859P1', 'WE8DEC') 
    FROM table 

Essayez avec:

NE8ISO8859P10 ISO 8859-10 Europe du Nord

NEE8ISO8859P4 ISO 8859-4 Nord et Europe

Nord-Est

Cette liste page Oracle 8i paramètres NLS

Questions connexes