我正在使用写文件
l_file := utl_file.fopen('OUT', 'a.txt', 'w');
utl_file.put_line(l_file, 'Rosëttenville');
Run Code Online (Sandbox Code Playgroud)
但我把它改成了
l_file := utl_file.fopen_nchar('OUT', 'a.txt', 'w', 32767);
utl_file.put_line_nchar(l_file, 'Rosëttenville');
Run Code Online (Sandbox Code Playgroud)
当我发现扩展的ASCII(代码127以上的字符)未正确写出时.但是第二个unicode版本也没有正确写入扩展字符.而不是Rosëttenville我得到Rosëttenville.有人知道怎么修这个东西吗?
你还没说你的数据库的字符集是什么,因而无论是合法的有"扩展ASCII"(可能是8859,与chr(235)在这种情况下)的字符串,或者,如果这只是一个演示.无论哪种方式,我认为,你的问题是试图隐式转换非unicode字符串.
ë是代码点EB,也是UTF-8 C3 AB.您将获得单独的字符Ã(代码点C3)和«(代码点AB).因此,它不能做的直接翻译chr(235),也就是0x00EB,要U+00EB.它似乎是通过UTF-8 C3 AB作为两个独立的角色.我不打算试着明白为什么......
你可以使用这个convert功能:
l_file := utl_file.fopen('OUT', 'a.txt', 'w');
utl_file.put_line(l_file,
convert('Rosëttenville', 'WE8ISO8859P1', 'UTF8'));
Run Code Online (Sandbox Code Playgroud)
......或者,由于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')));
Run Code Online (Sandbox Code Playgroud)
两者都给我你想要的价值,而你的原版给了我你看到的相同价值(我的数据库字符集AL32UTF8在Linux上的11gR2中).如果您的数据库字符集不是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')));
Run Code Online (Sandbox Code Playgroud)
首先使用Unicode值可能会更好,特别是如果您当前在表中混合使用'extended ascii'和其他字符串类型; 在这种情况下将转换应用于所有内容可能会产生一些奇怪的结果
| 归档时间: |
|
| 查看次数: |
11184 次 |
| 最近记录: |