我试图解码包含html实体的html。
我尝试过dbms_xmlgen.convert和utl_i18n.unescape_reference,但是结果并不令人满意。
SET ESCAPE ON;
SELECT
'dbms_xmlgen.convert' AS method,
dbms_xmlgen.convert('\♥', 1) AS hearts,
dbms_xmlgen.convert('\&', 1) AS amp_ent,
dbms_xmlgen.convert('\&', 1) AS amp_dec,
dbms_xmlgen.convert('\&', 1) AS amp_hex,
dbms_xmlgen.convert('\激\光', 1) AS chinese_laser
FROM dual
UNION ALL
SELECT
'utl_i18n.unescape_reference',
utl_i18n.unescape_reference('\♥'),
utl_i18n.unescape_reference('\&'),
utl_i18n.unescape_reference('\&'),
utl_i18n.unescape_reference('\&'),
utl_i18n.unescape_reference('\激\光')
FROM dual;我得到的结果是:
METHOD HEARTS AMP_ENT AMP_DEC AMP_HEX CHINESE_LASER
----------------------------------------------------------------------------------------------
dbms_xmlgen.convert ♥ & & & 激光
utl_i18n.unescape_reference ¿ & & & ¿¿我的实际问题涉及汉字,由Java程序处理,以创建PDF报告。我无法很容易地访问Java代码,但我确实可以控制程序使用的查询。
我用来测试的一个汉字实例是激光,谷歌翻译告诉我它的意思是‘激光’,我收到的编码为激光。正如上面的例子所示,它们没有被正确地解码。
我意识到,在第二行中,倒问号似乎表明实体已被转换,但不能正确显示。但是,这是Oracle自己做的,还是客户端(我在SQL+和蟾蜍中都尝试过)?当我将utl_i18n.unescape_reference插入到Java程序使用的查询中时,它适用于像± (±)这样的实体,但同样地,它不适用于汉字。
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
SQL*Plus: Release 10.1.0.5.0
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16发布于 2014-11-28 14:37:38
用utl_i18n.unescape_reference对汉字进行正确解码。实际上,它们只是在查询结果中没有正确显示,这可能不支持这些特殊字符。
您可以通过这个SQL Fiddle来确认这一点。
适当地显示字符是客户端的职责。如果客户端不能显示一个字符,它可能会显示一个颠倒的问号,或者其他的东西,或者只是普通的垃圾。
所以现在真正的问题是你想在哪里显示这个字符串..。
发布于 2014-11-28 15:55:21
您提到您尝试过SQL*Plus和蟾蜍;您的客户端操作系统Windows是什么?Unix?请参阅NLS_操作系统_字符集环境变量,它是在客户端上设置为客户端理解和支持的值的环境变量。如果您在Unix上,则调用
locale命令,查看将LANG或LC_ALL设置为什么;您可能需要设置
出口NLS_OS_CHARSET=UTF-8
或者类似的。
在Unix中,可以使用
locale -ahttps://dba.stackexchange.com/questions/82944
复制相似问题