データベースの文字セットが何であるか、したがって、文字列に「拡張 ascii」(この場合はおそらく8859-1 ) を含めることが正当であるかどうかchr(235)
、またはこれが単なるデモであるかどうかを述べていません。いずれにせよ、あなたの問題は非ユニコード文字列を暗黙的に変換しようとしていると思います。
ë
はコードポイント EBで、これも UTF-8C3 AB
です。別々の文字Ã
(コード ポイント C3 ) と«
(コード ポイント AB ) を取得しています。したがって、からchr(235)
への直接変換はできません。UTF-8を 2 つの別個の文字として使用しているようです。その理由を正確に理解しようとはしません...0x00EB
U+00EB
C3 AB
convert
次の関数を使用できます。
l_file := utl_file.fopen('OUT', 'a.txt', 'w');
utl_file.put_line(l_file,
convert('Rosëttenville', 'WE8ISO8859P1', 'UTF8'));
...または、その使用はオラクルによって推奨されていないため、utl_raw.convert
関数:
l_file := utl_file.fopen('OUT', 'a.txt', 'w');
utl_file.put_line(l_file,
utl_raw.cast_to_varchar2(utl_raw.convert(utl_raw.cast_to_raw('Rosëttenville'),
'ENGLISH_UNITED KINGDOM.WE8ISO8859P1', 'ENGLISH_UNITED KINGDOM.UTF8')));
どちらもあなたが望む値を私に与え、あなたのオリジナルはあなたが見たのと同じ値を私に与えました(私のDB文字セットはAL32UTF8
Linuxの11gR2にあります)。DB 文字セットが Unicode でない場合、国別文字セットは確かにそうであるように見えるため (両方の試行で同じ出力が得られたかどうかは質問では明確ではありません)、nchar
代わりにバージョンが機能するはずです。
l_file := utl_file.fopen_nchar('OUT', 'a.txt', 'w', 32767);
utl_file.put_line_nchar(l_file,
utl_raw.cast_to_varchar2(utl_raw.convert(utl_raw.cast_to_raw('Rosëttenville'),
'ENGLISH_UNITED KINGDOM.WE8ISO8859P1', 'ENGLISH_UNITED KINGDOM.UTF8')));
特に現在テーブルに「拡張 ascii」と他の文字列タイプが混在している場合は特に、最初に Unicode 値を使用する方がよいでしょう。その場合、すべてに変換を適用すると、奇妙な結果が生じる可能性があります...