Oracle:将 varchar2 字段中的 xml 实体转换为 utf-8 字符

标签 oracle utf-8 latin1

我在表中有一个字段,它保存特殊字符的 XML 实体,因为该表是 latin-1。
例如。 “Hallöle slovenčina ”(“ö”在latin-1中,但“slovenčina”中的“č”必须被某些将值存储到数据库中的应用程序转换为实体)

现在我需要通过将 XML 实体转换为其原始字符来将表导出为 utf-8 编码文件。

Oracle 中是否有一个函数可以为我处理这个问题,还是我真的需要为此创建一个巨大的键/值映射?

任何帮助是极大的赞赏。

编辑:我找到了函数 DBMS_XMLGEN.convert ,但它只适用于 < , >& .不在 &#NNN; :-(

最佳答案

我相信 dbms_xmlgen 的问题在于技术上只有五个 XML 实体。您的示例有一个数字 HTML 实体,它对应于 Unicode:

http://theorem.ca/~mvcorks/cgi-bin/unicode.pl.cgi?start=0100&end=017F

Oracle 有一个函数 UNISTR 在这里很有帮助:

select unistr('sloven\010dina') from dual;

我已将 269 转换为其等效的十六进制值 010d在上面的例子中(在 Unicode 中是 U+010D )。但是,您可以传递一个十进制数并进行如下转换:
select unistr('sloven\' || replace(to_char(269, 'xxx'), ' ', '0') || 'ina') from dual;

编辑:PL/SQL 解决方案:

这是我为你准备的一个例子。这应该循环并替换您从表中选择的每一行的任何匹配项。
create table html_entities (
    id NUMBER(3),
    text_row VARCHAR2(100)
);

INSERT INTO html_entities 
VALUES (1, 'Hallöle sloven&#269;ina &#266; &#250;');

INSERT INTO html_entities 
VALUES (2, 'I like the letter &#266;');

INSERT INTO html_entities 
VALUES (3, 'Nothing to change here.');

DECLARE
    v_replace_str NVARCHAR2(1000);
    v_fh UTL_FILE.FILE_TYPE;       
BEGIN
    --v_fh := utl_file.fopen_nchar(LOCATION IN VARCHAR2, FILENAME IN VARCHAR2, OPEN_MODE IN VARCHAR2, MAX_LINESIZE IN BINARY_INTEGER);

    FOR v_rec IN (select id, text_row from html_entities) LOOP
        v_replace_str := v_rec.text_row;
        WHILE (REGEXP_INSTR(v_replace_str, '&#[0-9]+;') <> 0) LOOP
            v_replace_str := REGEXP_REPLACE(
                v_replace_str, 
                '&#([0-9]+);',
                unistr('\' || replace(to_char(to_number(regexp_replace(v_replace_str, '.*?&#([0-9]+);.*$', '\1')), 'xxx'), ' ', '0')),
                1,
                1
            );
        END LOOP;

        -- utl_file.put_line_nchar(v_fh, v_replace_str);
        dbms_output.put_line(v_replace_str);

    END LOOP;
    --utl_file.fclose(v_fh);
END;
/

请注意,我已经在调用 UTL_FILE 函数时将 NVARCHAR 行(Oracle 的扩展字符集)写入数据库服务器上的文件。 dbms_output 虽然非常适合调试,但似乎不支持扩展字符,但是如果您使用 UTL_FILE 写入文件,这应该不是问题。这是 DBMS_OUTPUT:
Hallöle slovencina C ú
I like the letter C
Nothing to change here.

关于Oracle:将 varchar2 字段中的 xml 实体转换为 utf-8 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9114267/

相关文章:

php数据插入mysql utf8不起作用

python - ISO 8859-1 文件名未解码

java - 对 Oracle 的 JDBC 调用返回 3 个问号

SQL 更新帮助

java - Spring+Hibernate集成: Transaction Manager doesn't work using @Transactional

file - Dart语言:编码(与HttpRequest和http_server包有关)

php - Utf-8 字符显示为 ISO-8859-1

sql - SQL 分组的结果不符合预期

c - 使用 iconv 进行简单的 UTF8->UTF16 字符串转换

java - 从 UTF-16 格式的文件中读取一行