0

を使用してファイルを書き込んでいた

l_file := utl_file.fopen('OUT', 'a.txt', 'w');
utl_file.put_line(l_file, 'Rosëttenville');

しかし、私はこれを

l_file := utl_file.fopen_nchar('OUT', 'a.txt', 'w', 32767);
utl_file.put_line_nchar(l_file, 'Rosëttenville');

拡張 ASCII (コード 127 より上の文字) が正しく書き出されていないことがわかったとき。ただし、2 番目の Unicode バージョンでも、拡張文字が正しく書き込まれません。Rosëttenville の代わりに Rosëttenville を取得しています。誰でもこれを修正する方法を知っていますか?

4

2 に答える 2

5

データベースの文字セットが何であるか、したがって、文字列に「拡張 ascii」(この場合はおそらく8859-1 ) を含めることが正当であるかどうかchr(235)、またはこれが単なるデモであるかどうかを述べていません。いずれにせよ、あなたの問題は非ユニコード文字列を暗黙的に変換しようとしていると思います。

ëコードポイント EBで、これも UTF-8C3 ABです。別々の文字Ã(コード ポイント C3 ) と«(コード ポイント AB ) を取得しています。したがって、からchr(235)への直接変換はできません。UTF-8を 2 つの別個の文字として使用しているようです。その理由を正確に理解しようとはしません...0x00EBU+00EBC3 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文字セットはAL32UTF8Linuxの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 値を使用する方がよいでしょう。その場合、すべてに変換を適用すると、奇妙な結果が生じる可能性があります...

于 2013-06-11T10:57:33.883 に答える