我有一个varchar2
字段,其中包含一些文字,包括重音字符(例如à
,è
,...)和其他非文字字符(<
,{ {1}},!
...)。
我需要使用以下输出格式之一来转换符合html格式的字段:
;
以下是启动数据和两个可能需要的输出的示例,其中我尝试了一些尝试:
input output1 output2
á á á
â â â
输出(到目前为止需要和获得):
with test(starting, needed, needed2) as (
select 'abc À. < ! ; à ',
'abc À. < ! ; à',
'abc À. < ! ; à'
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;
通过对XML应用转换,生成的字符串用于构建符合Excel(甚至Excel 2003)的文件;这不支持重音字符,所以我需要转换。
我可以使用一些正则表达式,但我试图找到更好的解决方案。 我使用的是Oracle 11.2.0.3.0。
答案 0 :(得分:1)
据我所知,没有内置函数可以将重音字符更改为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 À. < ! ; à',
'abc À. < ! ; à'
from dual)
select starting, needed, needed2, to_htmlentity(starting) as result from test
答案 1 :(得分:1)
我认为你必须从ASCIISTR
函数开始。
对于非Unicode字符,它以十六进制格式返回UTF-16代码点,例如'00B7'
然后你需要一个转换器将十六进制数转换成十进制数,例如这个:
FUNCTION Base2Dec(BaseString IN VARCHAR2, Base IN INTEGER DEFAULT 16)
RETURN INTEGER DETERMINISTIC IS
BaseNumber INTEGER := 0;
HexString CONSTANT CHAR(16) := '0123456789ABCDEF';
BEGIN
IF Base > 16 THEN
RAISE NUMERIC_OVERFLOW;
END IF;
IF BaseString IS NULL THEN
RETURN NULL;
ELSE
FOR i IN 1..LENGTH(BaseString) LOOP
BaseNumber := BaseNumber * Base + INSTR(HexString, UPPER(SUBSTR(BaseString, i, 1))) - 1;
END LOOP;
RETURN BaseNumber;
END IF;
END Base2Dec;
基于此,您可以撰写转义字符串。