您好,欢迎访问一九零五行业门户网

xmldom.setCharset无效问题的解决

有朋友问到关于xmldom无法正确设置字符集的问题,也就是xmldom.setcharset无效的问题。 查询一下metalink,参考note:251
有朋友问到关于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 := '';
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
xx
===========
workaround:
xx
===========
pl/sql procedure successfully completed.
其它类似信息

推荐信息