您还没有说您的数据库字符集是什么,因此在字符串中包含 'extended ascii' (可能是8859-1,在这种情况下)是否合法chr(235)
,或者这只是一个演示。无论哪种方式,我认为,您的问题是试图隐式转换非 unicode 字符串。
ë
是代码点 EB,也是 UTF-8 C3 AB
。您将获得单独的字符Ã
(代码点 C3)和«
(代码点 AB)。所以它不能直接翻译 from chr(235)
,也就是0x00EB
, to U+00EB
。它似乎是通过 UTF-8C3 AB
作为两个单独的字符。我不会试图去理解为什么...
您可以使用以下convert
功能:
l_file := utl_file.fopen('OUT', 'a.txt', 'w');
utl_file.put_line(l_file,
convert('Rosëttenville', 'WE8ISO8859P1', 'UTF8'));
...或者,Oracle不鼓励使用该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')));
首先使用 Unicode 值可能会更好,特别是如果您当前在表中混合了“扩展 ascii”和其他字符串类型;在这种情况下将转换应用于所有内容可能会产生一些奇怪的结果......