使用Utl_file的Oracle UTF8文件编码

问题描述

我想将文件导出为UTF8编码。 当我检查v $ nls_parameters时,nls_characterset是WE8ISO8859P9。所以我文件的编码是Ansii。

如何在不更改v $ nls_parameters的情况下以UTF8编码导出文件

DECLARE
 v_os_touch_file                  utl_file.file_type;
 p_in_file                        VARCHAR2(50);
BEGIN
    v_os_touch_file := NULL;
    p_in_file := NULL;

    p_in_file := 'my_file_' || sysdate;
    v_os_touch_file := utl_file.fopen(my_path,p_in_file,'w');
    FOR i IN (
        SELECT
            *
        FROM
            my_table
    ) LOOP
    begin

        utl_file.put_line(v_os_touch_file,'TEST' );
        utl_file.put_line(v_os_touch_file,i.input);
         utl_file.fclose(v_os_touch_file);
END

解决方法

使用UTL_FILE.FOPEN_NCHAR

即使NVARCHAR2缓冲区的内容可以是AL16UTF16或UTF8(取决于数据库的国家字符集),文件的内容也始终以UTF8读写。 UTL_FILE根据需要在UTF8和AL16UTF16之间转换。

请注意,使用downloadimage() { var container = document.getElementById("htmltoimage"); html2canvas(container,{ allowTaint: true }).then(function (canvas) { var link = document.createElement("a"); document.body.appendChild(link); link.download = "html_image.jpg"; link.href = canvas.toDataURL(); link.target = '_blank'; link.click(); }); } 并不是很明智,因为它依赖于当前用户会话p_in_file := 'my_file_' || sysdate;的设置。假设默认格式为NLS_DATE_FORMAT

例如,像MM/DD/YYYY这样更好的用法。