用plsql写webservice,或许会出现中文乱码的问题。


原因:

   数据库编码是ZHS16GBK,HTTP报文编码:UTF-8。UTL_HTTP包的WRITE_TEXT过程会把字符转换成数据库编码。


措施:

   数据使用raw代替varcahr2,用blob代替clob。

   (1)发送报文时:        

VV_REQ_TEXT:=CONVERT(VV_REQ_TEXT,'UTF8','ZHS16GBK');
VV_REQ_RAW:=UTL_RAW.CAST_TO_RAW(VV_REQ_TEXT);
--UTL_HTTP.WRITE_TEXT(HTTP_REQ, VV_REQ_TEXT); --改成WRITE_RAW
UTL_HTTP.WRITE_RAW(HTTP_REQ, VV_REQ_RAW);

   

   (2)读取时也一样,READ_TEXT改成READ_RAW,保存备份表时由clob类型改成blob类型


   用varchar2时,'||'操作符会默认再转一次编码,会丢字节,即:

       CONVERT(VV_REQ_TEXT,'UTF8','ZHS16GBK') || '<A>' 会丢失字节,故应先拼串再转换。write_text也会自动根据数据库编码再编码一次,也会因此丢字节。