Oracle PL/SQL HTTP 请求响应编码问题
Oracle PL/SQL HTTP request response encoding issue
在 my previous question 之后,我似乎无法将 HTTP 响应从 ISO-8859-1
转换为 UTF-8
。
我正在使用 APEX_WEB_SERVICE
包来满足我的要求。 (我知道这个包自己用了UTL_HTTP
,所以用法上应该差不多)
我的工作:
apex_web_service.g_request_headers(1).name := 'Content-Type';
apex_web_service.g_request_headers(1).value := 'text/csv';
l_response := apex_web_service.make_rest_request(
p_url => MY_URL || '/download_csv',
p_http_method => 'GET'
);
l_response
包含 csv 数据,但所有 'é'
和 'è'
都替换为 '¿'
:
Type;Groupe Acc¿Code;EOTP autoris¿Familles EOTP autoris¿;Nom;Pr¿m;Adresse
而如果我直接访问 link,我的浏览器会使用正确的编码下载它:
Type;Groupe Accès;Code;EOTP autorisés;Familles EOTP autorisées;Nom;Prénom;Adresse
我尝试将响应转换为:
l_response := convert(l_response, 'AL16UTF16', 'WE8ISO8859P1');
但是完全没有效果
该网站是 https://www.stocknet.fr/,位于 ISO-8859-1
。
我的 Oracle NLS 参数(我显然不能修改):
+-------------------------+-----------------------------+
| PARAMETER | VALUE |
+-------------------------+-----------------------------+
| NLS_LANGUAGE | ENGLISH |
| NLS_TERRITORY | UNITED KINGDOM |
| NLS_CURRENCY | £ |
| NLS_ISO_CURRENCY | UNITED KINGDOM |
| NLS_NUMERIC_CHARACTERS | ., |
| NLS_CALENDAR | GREGORIAN |
| NLS_DATE_FORMAT | DD-MON-RR HH24:MI |
| NLS_DATE_LANGUAGE | ENGLISH |
| NLS_CHARACTERSET | WE8MSWIN1252 |
| NLS_SORT | BINARY |
| NLS_TIME_FORMAT | HH24.MI.SSXFF |
| NLS_TIMESTAMP_FORMAT | DD-MON-RR HH24.MI.SSXFF |
| NLS_TIME_TZ_FORMAT | HH24.MI.SSXFF TZR |
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH24.MI.SSXFF TZR |
| NLS_DUAL_CURRENCY | € |
| NLS_NCHAR_CHARACTERSET | AL16UTF16 |
| NLS_COMP | BINARY |
| NLS_LENGTH_SEMANTICS | BYTE |
| NLS_NCHAR_CONV_EXCP | FALSE |
+-------------------------+-----------------------------+
至此,不知道有没有什么办法可以从plsql来处理这个网站的数据。如有任何帮助、提示或建议,我们将不胜感激。
原来我必须使用 UTL_HTTP
和 DBMS_LOB
才能让 Oracle 正确解析字符。
这解决了我的问题:
DECLARE
l_clob CLOB;
l_http_request utl_http.req;
l_http_response utl_http.resp;
l_text VARCHAR2(32767);
BEGIN
dbms_lob.createtemporary(l_clob, false);
l_http_request := utl_http.begin_request(my_url || '/download_csv');
l_http_response := utl_http.get_response(l_http_request);
BEGIN
LOOP
utl_http.read_text(l_http_response, l_text, 32766);
dbms_lob.writeappend(l_clob, length(l_text), l_text);
END LOOP;
EXCEPTION
WHEN utl_http.end_of_body THEN
utl_http.end_response(l_http_response);
END;
dbms_output.put_line(l_clob); /* => ENCODING IS FINALLY GOOD ! */
dbms_lob.freetemporary(l_blob);
EXCEPTION
WHEN OTHERS THEN
utl_http.end_response(l_http_response);
dbms_lob.freetemporary(l_blob);
RAISE;
END;
/
我希望这可以帮助其他人。
在 my previous question 之后,我似乎无法将 HTTP 响应从 ISO-8859-1
转换为 UTF-8
。
我正在使用 APEX_WEB_SERVICE
包来满足我的要求。 (我知道这个包自己用了UTL_HTTP
,所以用法上应该差不多)
我的工作:
apex_web_service.g_request_headers(1).name := 'Content-Type';
apex_web_service.g_request_headers(1).value := 'text/csv';
l_response := apex_web_service.make_rest_request(
p_url => MY_URL || '/download_csv',
p_http_method => 'GET'
);
l_response
包含 csv 数据,但所有 'é'
和 'è'
都替换为 '¿'
:
Type;Groupe Acc¿Code;EOTP autoris¿Familles EOTP autoris¿;Nom;Pr¿m;Adresse
而如果我直接访问 link,我的浏览器会使用正确的编码下载它:
Type;Groupe Accès;Code;EOTP autorisés;Familles EOTP autorisées;Nom;Prénom;Adresse
我尝试将响应转换为:
l_response := convert(l_response, 'AL16UTF16', 'WE8ISO8859P1');
但是完全没有效果
该网站是 https://www.stocknet.fr/,位于 ISO-8859-1
。
我的 Oracle NLS 参数(我显然不能修改):
+-------------------------+-----------------------------+
| PARAMETER | VALUE |
+-------------------------+-----------------------------+
| NLS_LANGUAGE | ENGLISH |
| NLS_TERRITORY | UNITED KINGDOM |
| NLS_CURRENCY | £ |
| NLS_ISO_CURRENCY | UNITED KINGDOM |
| NLS_NUMERIC_CHARACTERS | ., |
| NLS_CALENDAR | GREGORIAN |
| NLS_DATE_FORMAT | DD-MON-RR HH24:MI |
| NLS_DATE_LANGUAGE | ENGLISH |
| NLS_CHARACTERSET | WE8MSWIN1252 |
| NLS_SORT | BINARY |
| NLS_TIME_FORMAT | HH24.MI.SSXFF |
| NLS_TIMESTAMP_FORMAT | DD-MON-RR HH24.MI.SSXFF |
| NLS_TIME_TZ_FORMAT | HH24.MI.SSXFF TZR |
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH24.MI.SSXFF TZR |
| NLS_DUAL_CURRENCY | € |
| NLS_NCHAR_CHARACTERSET | AL16UTF16 |
| NLS_COMP | BINARY |
| NLS_LENGTH_SEMANTICS | BYTE |
| NLS_NCHAR_CONV_EXCP | FALSE |
+-------------------------+-----------------------------+
至此,不知道有没有什么办法可以从plsql来处理这个网站的数据。如有任何帮助、提示或建议,我们将不胜感激。
原来我必须使用 UTL_HTTP
和 DBMS_LOB
才能让 Oracle 正确解析字符。
这解决了我的问题:
DECLARE
l_clob CLOB;
l_http_request utl_http.req;
l_http_response utl_http.resp;
l_text VARCHAR2(32767);
BEGIN
dbms_lob.createtemporary(l_clob, false);
l_http_request := utl_http.begin_request(my_url || '/download_csv');
l_http_response := utl_http.get_response(l_http_request);
BEGIN
LOOP
utl_http.read_text(l_http_response, l_text, 32766);
dbms_lob.writeappend(l_clob, length(l_text), l_text);
END LOOP;
EXCEPTION
WHEN utl_http.end_of_body THEN
utl_http.end_response(l_http_response);
END;
dbms_output.put_line(l_clob); /* => ENCODING IS FINALLY GOOD ! */
dbms_lob.freetemporary(l_blob);
EXCEPTION
WHEN OTHERS THEN
utl_http.end_response(l_http_response);
dbms_lob.freetemporary(l_blob);
RAISE;
END;
/
我希望这可以帮助其他人。