Oracle

如何在 Oracle 中轉換 html 實體?

  • November 28, 2014

我正在嘗試解碼包含 html 實體的 html。

我試過了dbms_xmlgen.convertutl_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 程式碼,但我可以控製程序使用的查詢。

我用於測試的一個漢字例子是雷射,Google翻譯告訴我它的意思是“雷射”,我收到編碼為激光. 這些沒有正確解碼,如上面的範例所示。

我意識到在第二行中,倒置的問號似乎表明實體轉換,但無法正確顯示。但是,這個 Oracle 本身是這樣做的,還是客戶端(我在 SQL+ 和 Toad 中都試過)?當我插入utl_i18n.unescape_referenceJava 程序使用的查詢時,它適用於±(±) 之類的實體,但同樣不適用於漢字。

如何正確解碼所有實體?

  • 我應該使用其他功能嗎?(這些是在 Internet 上某處推薦的)。
  • 我應該更改一些設置嗎?(相關設置如下圖)。

相關資訊

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

中文字元被正確解碼utl_i18n.unescape_reference。事實上,它們只是沒有正確顯示在您的查詢結果中,可能不支持這些特殊字元。

您可以使用此SQL Fiddle確認這一點。

客戶端負責適當地顯示字元。如果客戶端不能顯示一個字元,它可能會顯示一個倒置的問號、其他東西或只是普通的垃圾。

所以到現在為止,真正的問題是你想在哪裡顯示這個字元串……

引用自:https://dba.stackexchange.com/questions/82944