2014-02-18 90 views
4

我想通过POST将UTF8 json字符串通过utl_http发送到node.js服务器。发送字符串PL/SQL:使用UTF8字符串的UTL_HTTP POST导致破损字符

["Sant Julià de Lòria"] 

没有如约到达

["Sant Juli� de L�ria"] 

的PL/SQL代码是这样:

FUNCTION http_post_varchar(
    p_url   VARCHAR2, 
    p_request_body VARCHAR2) 
    RETURN VARCHAR2 
AS 
    req UTL_HTTP.REQ; 
    resp UTL_HTTP.RESP; 
    value VARCHAR2(32767); -- URL to post to 
    v_url VARCHAR2(200) := p_url; 
    -- Post Parameters 
    v_param VARCHAR2(32767) := p_request_body; 
    v_param_length NUMBER := length(v_param); 
BEGIN 
    req := UTL_HTTP.BEGIN_REQUEST (url=> v_url, method => 'POST'); 
    UTL_HTTP.SET_HEADER (r  => req, 
         name => 'Content-Type', 
         value => 'application/json;charset=UTF-8'); 
    UTL_HTTP.SET_HEADER (r  => req, 
         name => 'Content-Length', 
         value => v_param_length); 
    UTL_HTTP.WRITE_TEXT (r  => req, 
         data => v_param); 

    resp := UTL_HTTP.GET_RESPONSE(req); 
    LOOP 
    UTL_HTTP.READ_LINE(resp, value, TRUE);  
    END LOOP; 
    UTL_HTTP.END_RESPONSE(resp); 
    RETURN 'OK'; 
EXCEPTION 
    WHEN UTL_HTTP.END_OF_BODY THEN 
    UTL_HTTP.END_RESPONSE(resp); 
    RETURN 'OK'; 
END http_post_varchar; 
+0

什么是您的数据库字符集?什么是你的会话nls_lang字符集? –

+0

字符集:AL32UTF8 NLS_CHARACTERSET:GERMAN –

+1

您确定您正在以UTF8字符串的形式阅读响应吗?它看起来好像你试图读取一个8位字符集的UTF8字符串('ò'=>'�') –

回答

3

您应该更改您的代码:

UTL_HTTP.SET_BODY_CHARSET('UTF-8'); 
UTL_HTTP.SET_HEADER (r  => req, 
        name => 'Content-Length', 
        value => LENGTHB(v_param)); 

UTL_HTTP.WRITE_RAW (r => req, 
        data => UTL_RAW.CAST_TO_RAW(v_param)); 

LENGTHB由于UTF-8的字节长度。否则,计算的长度将为假,并且在目标端出现错误(意外结束输入或其他)。

+2

我通过额外添加了 “utl_http.set_body_charset('UTF-8')来完成工作。 ;” 注意:一旦执行此设置对整个会话有效,即使您将其移除以进行测试,该设置仍然有效。 –

+0

将该行添加到解决方案 – Luscus