La façon de sortie de caractères ascii étendus à l'aide de Oracle utl_file
J'écrivais des fichiers à l'aide de
l_file := utl_file.fopen('OUT', 'a.txt', 'w');
utl_file.put_line(l_file, 'Rosëttenville');
mais j'ai changé de ce
l_file := utl_file.fopen_nchar('OUT', 'a.txt', 'w', 32767);
utl_file.put_line_nchar(l_file, 'Rosëttenville');
quand j'ai découvert que l'ASCII étendu (caractères de code ci-dessus 127) n'ont pas été écrits correctement. Toutefois, la deuxième version unicode aussi de ne pas écrire les caractères spéciaux correctement. Au lieu de Rosëttenville je suis de Rosëttenville. Quelqu'un sait comment résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas dit ce que votre base de données utilise le jeu de caractères, et donc de savoir si c'est légitime d'avoir 'ascii étendu' (probablement 8859-1, avec
chr(235)
dans ce cas) dans une chaîne de caractères, ou si c'est juste une démo. De toute façon, je pense que votre problème est d'essayer de convertir implicitement une chaîne non-unicode.ë
est point de code EB, qui est aussi en UTF-8C3 AB
. Vous obtenez les caractères séparésÃ
(point de code C3) et«
(point de code AB). Donc il ne peut pas faire une traduction directe de l'chr(235)
, qui est0x00EB
, àU+00EB
. Il semble aller via l'UTF-8C3 AB
comme deux caractères distincts. Je ne vais pas essayer de comprendre exactement pourquoi...Vous pouvez soit utiliser le
conversion
function:... ou, comme l'utilisation de c'est décourager par Oracle, la
utl_raw.convertir
function:Les deux me donner la valeur que vous voulez, et votre original m'a donné la même valeur que vous avez vu (d'où ma DB jeu de caractères est
AL32UTF8
dans 11gR2 sur Linux). Si votre base de données utilise le jeu de caractères non Unicode, votre jeu de caractères nationaux certainement (il n'est pas clair dans la question de savoir si vous avez obtenu le même résultat avec les deux tentatives), de sorte que lenchar
version devrait fonctionner à la place:Il serait probablement préférable de travailler avec des valeurs Unicode en premier lieu, en particulier si vous avez actuellement un mélange de 'ascii étendu" et d'autres types de chaînes dans un tableau; l'application de la conversion de tout ce qui dans ce cas peut donner de drôles de résultats...
AMERICAN_AMERICA.WE8ISO8859P1
etAMERICAN_AMERICA.UTF8
pour le de et à puis.ë
n'est pas un caractère ASCII, c'est dans les "étendu" des séries comme 8859-1. Si vous l'avez dans unvarchar2
colonne puis il est déjà en UTF-8, et de travailler avec une chaîne fixe, comme cela pourrait ne pas être totalement utile.iconv -f UTF8 -t ISO-8859-1 a.txt > b.txt
.put_raw()
vous donne quelque chose d'utilisable dans le fichier, mais qui semble fonctionner OK dans ce cas. J'ai juste fait leutl_raw
version en raison de la doc commentaire. Si vous faites affaire avec les indigènes DB jeux de caractères de toute façon - comme l'OP semble être - il ne semble pas faire de différence vraiment, et l'extra -utl_raw
conversion il fait juste un peu plus explicite ce qui se passe, et que les soins doivent être prises. Si vous utilisez un jeu de caractères différents dans leutl_raw.convert
appel, puis lacast_to_varchar2
peut vous donner des problèmes, bien, oui.UTL_FILE.PUT_LINE ne pas faire de conversion de données et de les exporter les données dans la base de données de jeu de caractères par défaut.
Si Vous avez besoin de faire une conversion à écrire:
Vous devez définir: