Welcome 微信登录

首页 / 数据库 / MySQL / xmldom.setCharset无效问题的解决

    有朋友问到关于XMLDOM无法正确设置字符集的问题,也就是xmldom.setCharset无效的问题。    查询一下Metalink,参考Note:251011.1,这是Oracle的一个Bug,可以通过dbms_output来绕过这个问题。    在Oracle Databsae 10g中测试:SQL> select * from v$version
  2  /BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE    10.2.0.2.0      Production
TNS for Linux: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production
 
    效果如下,这是一个普遍性问题,在9i、10g中都存在:SQL> create or replace procedure test_SETCHARSET
  2  is
  3  doc xmldom.DOMDocument;
  4  main_node xmldom.DOMNode;
  5  root_node xmldom.DOMNode;
  6 
  7  item_node xmldom.DOMNode;
  8  root_elmt xmldom.DOMElement;
  9  item_elmt xmldom.DOMElement;
10  item_text xmldom.DOMText;
11 
12 
13 
14  buffer_problem          varchar2(2000); 
15  buffer_root_node      varchar2(2000);
16  buffer_doc_header      varchar2(80);
17  buffer_doc            varchar2(2000);
18  reqRootNode xmldom.DOMNode; 
19 
20  BEGIN
21  --
22  -- the problem : 
23  --
24  dbms_output.put_line("=========== ");
25  dbms_output.put_line(" PROBLEM: setCharSet ISO-8859-1 has no effect" );
26 
27  doc := xmldom.newDOMDocument;
28  main_node := xmldom.makeNode(doc);
29  xmldom.setversion(doc,"1.0");
30  xmldom.setCharset(doc,"ISO-8859-1");
31  root_elmt := xmldom.createElement(doc, "A");
32  root_node := xmldom.appendChild( main_node, xmldom.makeNode(root_elmt));
33 
34  item_elmt := xmldom.createElement(doc, "B");
35  item_node := xmldom.appendChild(root_node, xmldom.makeNode(item_elmt));
36  -- chr (192) :    LATIN CAPITAL LETTER A WITH GRAVE in  ISO-8859-1
37  item_text := xmldom.createTextNode(doc, "X" ||chr (192) ||"X");
38  item_node := xmldom.appendChild(item_node, xmldom.makeNode(item_text));
39 
40  xmldom.writetobuffer(doc, buffer_problem);
41  -- the final document here is encoded in UTF8
42  dbms_output.put_line(buffer_problem);
43  dbms_output.put_line(" ");
44  dbms_output.put_line("=========== ");
45 
46  --
47  -- workaround
48  --
49 
50  dbms_output.put_line(" WORKAROUND:" );
51  dbms_output.put_line(" "); 
52    buffer_doc_header := "<?xml version="1.0" encoding="ISO-8859-1"?>";
53    reqRootNode := xmldom.makeNode (xmldom.getDocumentElement(doc));
54   
55    xmldom.writetobuffer(reqRootNode, buffer_root_node);
56    buffer_root_node := convert (buffer_root_node,"WE8ISO8859P1","UTF8");
57    buffer_doc :=  buffer_doc_header || buffer_root_node;
58   
59  dbms_output.put_line(buffer_doc );
60  dbms_output.put_line("=========== ");
61  --
62 
63  xmldom.freeDocument(doc);
64 
65  END;
66  /Procedure created.SQL> set serveroutput on
SQL> exec test_setcharset
===========
PROBLEM: setCharSet ISO-8859-1 has no effect
<?xml version="1.0"?>
<A>
  <B>XX</B>
</A>
===========
WORKAROUND:
<?xml version="1.0" encoding="ISO-8859-1"?><A>
  <B>XX</B>
</A>
===========PL/SQL procedure successfully completed.Oracle数据库编写有效事务指导方针Oracle将发布41个安全补丁相关资讯      oracle 
  • [INS-32052] Oracle基目录和Oracle  (07/22/2014 07:41:41)
  • Oracle 4个大对象(lobs)数据类型  (02/03/2013 12:33:05)
  • Oracle按时间段分组统计  (07/26/2012 10:36:48)
  • [Oracle] dbms_metadata.get_ddl的  (07/12/2013 07:37:30)
  • Liferay Portal 配置使用Oracle和  (07/31/2012 20:07:18)
  • Concurrent Request:Inactive   (07/20/2012 07:44:05)
本文评论 查看全部评论 (0)
表情: 姓名: 字数