Проблема с кодировкой в XML в Oracle

Рейтинг: 0Ответов: 0Опубликовано: 06.07.2023

Имеется БД Oracle 19c с кодировкой

PARAMETER VALUE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8

Создаю XML средствами Orcle, соответственно в тегах присутствует кириллица. Я задаю кодировку UTF-8

SELECT xmlroot(xmlagg(xmlelement("MA",
                                 xmlforest(1 "STATUS",
                                           v.app_type "APP_TYPE",
                                           v.fname "FNAME",
                                           v.pname "PNAME",
                                           v.lname "LNAME",
                                           v.dob "DOB",
                                           v.dob_od "DOB_OD",
                                           v.pob "POB",
                                           v.inc_tm "INC_TM",
                                           v.gender "GENDER",
                                           v.educ_lvl "EDUC_LVL",
                                           v.marit_st "MARIT_ST",
                                           v.kids "KIDS"))),
               version '1.0" encoding="UTF-8') AS xml
FROM nh_data_vector v
WHERE v.id_nh = 1

При этом отображается XML корректно.

<?xml version="1.0" encoding="UTF-8"?>
<MA>
  <STATUS>1</STATUS>
  <APP_TYPE>4</APP_TYPE>
  <FNAME>ДМИТРИЙ</FNAME>
  <PNAME>ВЛАДИМИРОВИЧ</PNAME>
  <LNAME>ЗИМИН</LNAME>
  <DOB>1991-11-20</DOB>
  <DOB_OD>1991-11-20</DOB_OD>
  <POB>ГОР.САРАТОВ</POB>
  <INC_TM>100000</INC_TM>
  <GENDER>1</GENDER>
  <EDUC_LVL>3</EDUC_LVL>
  <MARIT_ST>1</MARIT_ST>
  <KIDS>0</KIDS>
</MA>

Но при передаче сообщения в другую систему, начинает лететь кодировка. Как отправляю:

FUNCTION f_get_response
  (
    in_request IN CLOB
  ) RETURN CLOB IS
  
    l_req utl_http.req;
    l_res utl_http.resp;
    l_url      VARCHAR2(4000) := 'http://test_send_case_test';
    l_buffer   CLOB;
    l_content  CLOB;
    l_response CLOB;
  
  BEGIN
  
    l_content := in_request;
  
    l_req := utl_http.begin_request(url          => l_url,
                                    method       => 'POST',
                                    http_version => 'HTTP/1.1');
    utl_http.set_header(l_req, 'user-agent', 'mozilla/4.0');
    utl_http.set_body_charset(l_req, 'UTF-8');
    utl_http.set_header(l_req, 'Transfer-Encoding', 'chunked');
    utl_http.set_header(l_req, 'Content-Length', length(l_content));
  
    utl_http.write_text(l_req, l_content);
  
    l_res := utl_http.get_response(l_req);
  
    BEGIN
    
      LOOP
        utl_http.read_line(l_res, l_buffer);
        l_response := l_response || l_buffer;
      END LOOP;
      utl_http.end_response(l_res);
    
    EXCEPTION
      WHEN utl_http.end_of_body THEN
        utl_http.end_response(l_res);
    END;
  
    RETURN(l_response);
  
  END;

Решил проверить и запрос преобразовал в blob-объект задав ему кодировку UTF-8

SELECT r.id_nh,
       r.request,
       xmlserialize(content xmltype(r.request) AS BLOB encoding 'UTF-8')
FROM nh_request r
WHERE r.id_nh = 279

Собственно вид

<MA>
    <STATUS>1</STATUS>
    <APP_TYPE>4</APP_TYPE>
    <FNAME>ДМРРўР РР™</FNAME>
    <PNAME>ВЛАДРРњРР РћР’РР§</PNAME>
    <LNAME>Р—РРњРРќ</LNAME>
    <DOB>1991-11-20</DOB>
    <DOB_OD>1991-11-20</DOB_OD>
    <POB>ГОР.САРАТОВ</POB>
    <INC_TM>100000</INC_TM>
    <GENDER>1</GENDER>
    <EDUC_LVL>3</EDUC_LVL>
    <MARIT_ST>1</MARIT_ST>
    <KIDS>0</KIDS>
</MA>

Из декодера понял что это кодировка Win-1251.

И если я меняю кодировку в blob на Windows-1251, то данные приходят в норму.

В связи с этим имею вопрос, как так происходит, что данные кодируются на БД в Windows-1251, хотя везде используется UTF-8? И как это лечить?

Ответы

Ответов пока нет.