有朋友问到关于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.