URL 正在将 utf8 字符编码为 Oracle APEX js 重定向中的 %
URL is encoding utf8 chars to % in Oracle APEX js redirect
我的 Oracle APEX 页面的“页面加载时执行”部分有一个 jQuery 代码。我的页面包含 PL/SQL 个动态内容,更具体地说,是两个 select 列表,它们充当过滤器。因此,当 selected 其中一个 select 列表的值更改时,将调用具有正确页面项目值的重定向。 JQuery 下面的代码只处理调用页面重定向的第二个 select 列表。
var appId = $v('pFlowId');
var pageId = $v('pFlowStepId');
var this_page_link_prefix = 'f?p='+appId+':'+pageId+':::NO:RP:';
$(document).on('change', '#category_select', function() {
if ($(this).val() != '') {
var href = this_page_link_prefix+'P'+pageId+'_FILTER_CATEGORY,P'+pageId+'_FILTER_RACE_TYPE:'
+$(this).val()+','+$('#race_type_select').val()+':';
console.log(href);
$(location).attr('href', href);
}
});
这里遇到了自己无法解决的问题。当我的过滤器包含 UTF-8 字符(如“Ž”)时,url 以 % 编码进行编码。例如,当 select 列表包含“Ženy”时,我的重定向 URL 看起来像这样:
f?p=123:5:9348018667019::NO:RP:P5_FILTER_CATEGORY,P5_FILTER_RACE_TYPE:%25C5%25BDeny,1
当我尝试控制台日志 href 变量时,它包含正确的 URL:
f?p=123:5:9348018667019::NO:RP:P5_FILTER_CATEGORY,P5_FILTER_RACE_TYPE:Ženy,1
我想我浏览了所有应用程序设置,但仍然找不到解决方案。我将不胜感激任何帮助。
我不知道如何控制是否在浏览器的 URL 栏中显示 UTF-8 字符。 Chrome 例如会让我输入它们并正确显示它们,但是当它向服务器发送请求时,它 percent-encodes 它们。尝试使用 F12 开发人员工具并执行一个简单的请求,例如https://www.google.com/search?q=Ženy
所以这可能是您的浏览器在做。但是您绝对可以解决的问题是确保 P5_FILTER_CATEGORY 页面项目以正确的 UTF-8 值结束,而不是 percent-encoding。只需添加一个 "Before Header" 过程或做一些事情:
:P5_FILTER_CATEGORY := UTL_URL.UNESCAPE (:P5_FILTER_CATEGORY, 'UTF8');
另一件可能有帮助的事情,这很容易做到,就是编辑您的页面模板并确保它们在页面中设置您想要的字符集 header,例如
<html><head>
<meta charset="utf-8"/>
....
最后,您可能想要使用浏览器开发工具并检查哪个 Content-Type charset
APEX 在 HTTP header 中发送。我不记得如何更改它,但如果它不是 utf-8,你可能想考虑更改它。
我的 Oracle APEX 页面的“页面加载时执行”部分有一个 jQuery 代码。我的页面包含 PL/SQL 个动态内容,更具体地说,是两个 select 列表,它们充当过滤器。因此,当 selected 其中一个 select 列表的值更改时,将调用具有正确页面项目值的重定向。 JQuery 下面的代码只处理调用页面重定向的第二个 select 列表。
var appId = $v('pFlowId');
var pageId = $v('pFlowStepId');
var this_page_link_prefix = 'f?p='+appId+':'+pageId+':::NO:RP:';
$(document).on('change', '#category_select', function() {
if ($(this).val() != '') {
var href = this_page_link_prefix+'P'+pageId+'_FILTER_CATEGORY,P'+pageId+'_FILTER_RACE_TYPE:'
+$(this).val()+','+$('#race_type_select').val()+':';
console.log(href);
$(location).attr('href', href);
}
});
这里遇到了自己无法解决的问题。当我的过滤器包含 UTF-8 字符(如“Ž”)时,url 以 % 编码进行编码。例如,当 select 列表包含“Ženy”时,我的重定向 URL 看起来像这样:
f?p=123:5:9348018667019::NO:RP:P5_FILTER_CATEGORY,P5_FILTER_RACE_TYPE:%25C5%25BDeny,1
当我尝试控制台日志 href 变量时,它包含正确的 URL:
f?p=123:5:9348018667019::NO:RP:P5_FILTER_CATEGORY,P5_FILTER_RACE_TYPE:Ženy,1
我想我浏览了所有应用程序设置,但仍然找不到解决方案。我将不胜感激任何帮助。
我不知道如何控制是否在浏览器的 URL 栏中显示 UTF-8 字符。 Chrome 例如会让我输入它们并正确显示它们,但是当它向服务器发送请求时,它 percent-encodes 它们。尝试使用 F12 开发人员工具并执行一个简单的请求,例如https://www.google.com/search?q=Ženy
所以这可能是您的浏览器在做。但是您绝对可以解决的问题是确保 P5_FILTER_CATEGORY 页面项目以正确的 UTF-8 值结束,而不是 percent-encoding。只需添加一个 "Before Header" 过程或做一些事情:
:P5_FILTER_CATEGORY := UTL_URL.UNESCAPE (:P5_FILTER_CATEGORY, 'UTF8');
另一件可能有帮助的事情,这很容易做到,就是编辑您的页面模板并确保它们在页面中设置您想要的字符集 header,例如
<html><head>
<meta charset="utf-8"/>
....
最后,您可能想要使用浏览器开发工具并检查哪个 Content-Type charset
APEX 在 HTTP header 中发送。我不记得如何更改它,但如果它不是 utf-8,你可能想考虑更改它。