sql – Oracle以html格式转换重音字符

我有一个包含一些文本的varchar2字段,包括重音字符(例如à,è,…)和其他非文字字符(<,!,; …). 我需要使用以下输出格式之一以html兼容格式转换此字段:

input     output1     output2
    á     &#225;      &aacute;  
    â     &#226;      &acirc;

下面是一个启动数据和两个可能需要的输出的示例,我尝试了一些失败:

with test(starting, needed, needed2) as (
    select 'abc À. < ! ; à ',
           'abc &Agrave;. &lt; ! ; &agrave;',
           'abc &#192;. &#60; ! ; &#224;'
    from dual)
select starting, needed, needed2, UTL_I18N.escape_reference(starting) as result, 'UTL_I18N' as function from test union all
select starting, needed, needed2, convert(starting, 'US7ASCII' ) ,               'convert' from test union all
select starting, needed, needed2, HTF.ESCAPE_SC(starting) ,                      'htf' from test union all
select starting, needed, needed2, asciiStr(starting) ,                           'ascii' from test union all
select starting, needed, needed2, dbms_xmlgen.convert(starting) ,                'dbms_xmlgen' from test union all
select starting, needed, needed2, TRANSLATE(starting USING CHAR_CS) ,            'translate' from test;

输出(到目前为止需要和获得):

STARTING             NEEDED                                   NEEDED2                                  RESULT                         FUNCTION
-------------------- ---------------------------------------- ---------------------------------------- ------------------------------ -----------
abc À. < ! ; à       abc &Agrave;. &lt; ! ; &agrave;          abc &#192;. &#60; ! ; &#224;             abc À. &lt; ! ; à              UTL_I18N
abc À. < ! ; à       abc &Agrave;. &lt; ! ; &agrave;          abc &#192;. &#60; ! ; &#224;             abc ?. < ! ; ?                 convert
abc À. < ! ; à       abc &Agrave;. &lt; ! ; &agrave;          abc &#192;. &#60; ! ; &#224;             abc À. &lt; ! ; à              htf
abc À. < ! ; à       abc &Agrave;. &lt; ! ; &agrave;          abc &#192;. &#60; ! ; &#224;             abc \00B7. < ! ; \2026         ascii
abc À. < ! ; à       abc &Agrave;. &lt; ! ; &agrave;          abc &#192;. &#60; ! ; &#224;             abc À. &lt; ! ; à              dbms_xmlgen
abc À. < ! ; à       abc &Agrave;. &lt; ! ; &agrave;          abc &#192;. &#60; ! ; &#224;             abc À. < ! ; à                 translate

生成的字符串用于通过对XML应用转换来构建符合Excel(甚至是Excel 2003)的文件;这不支持重音字符,所以我需要转换.

我可以使用一些正则表达式,但我试图找到一个更好的解决方案.
我正在使用Oracle 11.2.0.3.0.

最佳答案 据我所知,没有内置函数可以将重音字符更改为html实体.

但你可以使用像这样的函数:

create or replace function to_htmlentity(text varchar2)
return varchar2 deterministic is
    result varchar(200):='';
begin 
    for letter in (
        select 
        substr(text,level,1) as character,
        ascii(substr(text,level,1)) as ascii 
        from dual connect by level <= length(text)
    )loop
        if letter.ascii > 128 
        or letter.ascii in (34,38,60,62) --",&,<,> 
        then
            result := result||'&#'||letter.ascii||';';
        else
            result := result||letter.character;
        end if;
    end loop;
    return result;
end;

此函数接受任何非ascii(128)字符并更改为其各自的html实体.我发现它比使用RegEx更清楚.

然后你可以使用它如下:

with test(starting, needed, needed2) as (
    select 'abc À. < ! ; à',
           'abc &Agrave;. &lt; ! ; &agrave;',
           'abc &#192;. &#60; ! ; &#224;'
    from dual)
select starting, needed, needed2, to_htmlentity(starting) as result from test
点赞