我们在Oracle DB中存储了一些String值。我们将这些值写入.DAT文件。我们的包中的查询片段如下所示:
打开文件:
l_file := UTL_FILE.fopen(l_dir, l_file_name, 'W');
写入档案:
UTL_FILE.putf(l_file, ('E' ||';'|| TO_CHAR(l_rownum) ||';'|| TO_CHAR(v_cdr_session_id_seq) ||';' || l_record_data));
数据库中的字符串值: "Owner’s address"
.DAT文件中的字符串值: "Owner’s address"
问题是:如何在将其写入输出文件时避免使用这些特殊字符?
答案 0 :(得分:2)
我假设您的数据库使用字符集AL32UTF8
(现在是默认值)。在这种情况下试试这个:
l_file := UTL_FILE.FOPEN_NCHAR(l_dir, l_file_name, 'W');
PUT_NCHAR(l_file, ('E;'|| l_rownum ||';'|| v_cdr_session_id_seq||';' ||l_record_data);
注意函数FOPEN_NCHAR:即使NVARCHAR2缓冲区的内容可能是AL16UTF16或UTF8(取决于数据库的国家字符集),也始终读取和写入文件的内容在UTF8。
答案 1 :(得分:1)
总结来自评论,您的Linux会话和Vim配置都使用UTF-8,但您的终端仿真器软件正在使用Windows-1252 codepage。这会将您所拥有的“卷曲”右引号标记’
(Unicode codepoint 2019)呈现为’
。
您需要将模拟器的配置从Windows-1252更改为UTF-8。具体取决于您使用的是哪个模拟器。例如,在PuTTY中,您可以通过右键单击窗口标题栏并选择“更改设置...”来更改当前会话,然后转到“窗口”类别及其“翻译”子类别,并更改默认“Win 252(Western)”到“UTF-8”。
如果您在Vim中打开文件,则可以控制-L重绘它。这只会影响当前的会议;要使更改永久化,您需要对存储的会话设置进行相同的更改,从“新会话...”对话框 - 加载当前设置,并记住在实际打开新会话之前保存更改。 / p>
其他模拟器具有类似的设置,但在不同的地方。对于XShell,according to their web site:
您可以通过在标准工具栏上的编码列表中选择Unicode(UTF8)轻松切换到UTF8编码。
看起来您也可以为会话设置or as the default。