2014-02-18 93 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