Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未捕获URI错误:URI格式错误-Windows上的jquery UI选项卡_Javascript_Jquery_Html_Jquery Ui_Uri - Fatal编程技术网

Javascript 未捕获URI错误:URI格式错误-Windows上的jquery UI选项卡

Javascript 未捕获URI错误:URI格式错误-Windows上的jquery UI选项卡,javascript,jquery,html,jquery-ui,uri,Javascript,Jquery,Html,Jquery Ui,Uri,我正在本地Windows开发环境中使用jquery UI选项卡。我在用他们的电脑测试 我怀疑这是由于windows环境中的URI如下所示: file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1 我怎么能让它在本地Windows上工作,因为我的客户在上线之前会希望看到它在本地Windows上工作?我已经测试过了,我知道这是由uri上的特殊字符编码引起的(比如“acções”一词)有没有一种方法可以让

我正在本地Windows开发环境中使用jquery UI选项卡。我在用他们的电脑测试

我怀疑这是由于windows环境中的URI如下所示:

file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1
我怎么能让它在本地Windows上工作,因为我的客户在上线之前会希望看到它在本地Windows上工作?我已经测试过了,我知道这是由uri上的特殊字符编码引起的(比如“acções”一词)有没有一种方法可以让它即使与特殊字符一起工作


我知道我只需删除这些字符并重命名文件/文件夹就可以解决这个问题,但我希望有一个更适合客户的解决方案,以防他们决定再次重命名文件夹(而所有内容都在他们的脸上乱翻)。

这是decodeURIComponent方法的结果,假设给定字符串的编码字节百分比为UTF-8(参见ECMAScript第15.1.3节中的第4.d.vii.8步)。您的示例字符串:

"file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1"
包含解码字节百分比0xE7 0xF5,在有效的UTF-8字符串中不能一个接一个出现(它们表示Windows-1252中的两个字符
õ
)。相应地,decodeURIComponent抛出一个URIError异常

解决这个问题的一种方法(我还没有测试过)是确保使用UTF-8字符编码,而不是
ISO-8859-1
,我认为这是默认的

为此,请包括一个元标记,如下所示:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

(虽然理想的做法是包含一个包含字符集的内容类型头,但在涉及文件系统的本地测试中,这通常是不可能的。)

并且还要确保网页本身是用UTF-8编码的


另外,您的示例字符串出现在Web页面上的什么位置?它是如何生成的?您在哪个浏览器上测试了该行为?答案将帮助我告诉你该怎么做。

像这样的事情

s = "file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1";
decodeURIComponent( unescape(s) )

我将演示代码剪切并粘贴到保存在文件夹路径中的记事本中,文件夹名称(新文件夹)中有一个空格,即test1.html。然后我双击test1.html,它就像做梦一样工作


很明显,您更改了某些内容,无论是什么内容,将其更改回原处都可以正常工作。

这是jquery中的一个错误--针对非UTF8 URL。我也有同样的问题并解决了。由于我无法将页面的编码更改为UTF-8,我最终修补了jqueryui并使用Rainer Plumer的解决方案作为解决方案,但我不得不使用它两次,因为我有一些包含编码URI的URI参数。所以我的解决办法是

decodeURIComponent( unescape( unescape(s)) )
更一般地说,应该有重复直到循环,直到你不断得到相同的结果。这个解决方案肯定不是一个干净的解决方案。以下是清洁解决方案:

PS:jquery UI的整个补丁:

function isLocal( anchor ) {
        return anchor.hash.length > 1 && 
                decodeURIComponent( unescape( unescape( anchor.href.replace( rhash, "" ) ) ) ) ===
                        decodeURIComponent( unescape( unescape( location.href.replace( rhash, "" ) ) ) );
}

我自己也有这个问题。我找不到清理源字符串的方法,所以我绕过了异常,所以数据将继续加载。 希望这有帮助

try {
    myVal = decodeURIComponent(sourceVal);
} catch (err) {
    myVal = "";
}
我遇到了相同的错误“Uncaught URIError:URI malformed”,我通过以下操作修复了该错误:

decodeURIComponent(encodeURIComponent(mystring))


注意:将我的页面编码更改为UTF-8或添加unescape()对我不起作用。

您的代码是纯HTML/JavaScript吗?没有服务器端代码?您能在演示机上运行一个小型web服务器来避免文件://URL的问题吗?这是一个针对非UTF8 URL的错误。有人知道非UTF8网站的解决方法吗?我调查了一下这个问题,它引出了不同的问题-。请看附带的测试用例。我将演示代码粘贴到记事本中,并将其保存为桌面上的test1.html。双击它,它工作得非常好。@danny117,您提到的是哪种演示代码?请给出明确的答案。将页面编码更改为UTF-8并不总是可行的!嗯
unescape
是,所以它可能不是干净的解决方案。正确的问题是:为什么
decodeURIComponent
在非UTF8URI上失败?URI中是否允许使用这些字符编码?这个非UTF-8 URI是由我的浏览器(Firefox)通过在非UTF-8页面上提交表单创建的。因此,在某些标准软件中一定有一个bug!我调查了一下这个问题,它引出了不同的问题-。请查看包含的测试用例。看起来其他线程/问题解决了吗?看起来问题出在形式编码上,它是ISO,但应该是utf8。我在谷歌上快速搜索了一下,发现了这个转换函数,它似乎与您的表单示例配合得很好。谢谢,很有趣。为什么他们没有使用表单元素的
accept charset=“utf-8”
属性?它似乎做了同样的工作,不是吗?我最终修补了我的jqueryui并使用了您的解决方案作为解决方案,但我不得不使用它两次,因为我有一些包含编码URI的URI参数。所以我的解决方案是
decodeURIComponent(unescape(unescape))
。更一般地说,Y应该是重复直到循环,直到你得到相同的结果。显然,这不是一个干净的解决方案。丹尼,你说的不太清楚。请澄清您的答案-您指的是哪个演示。可能是因为您更改了文件的编码,所以工作正常?很高兴能描述一下你的改变是什么。@Tomas是第一个链接。你知道哪里写着“演示代码”。我只是说,如果你不能复制错误,你就无法修复它。你没有抓住要点——你必须在URI中有非UTF-8字符,所以保存为test1.html显然是不可行的。你应该按照整个过程来复制它。您也可以在这里查看我的测试用例。@Tomas我刚才试着给文件夹命名file:///C:/Users/daniel/Documents/ac%C3%A7%C3%B5es/test1.html#tab-1它对我仍然有效。疯狂,但是当你把链接粘贴到这个疯狂的文本框中时,它会逃逸出来,并且消失
function isLocal( anchor ) {
        return anchor.hash.length > 1 && 
                decodeURIComponent( unescape( unescape( anchor.href.replace( rhash, "" ) ) ) ) ===
                        decodeURIComponent( unescape( unescape( location.href.replace( rhash, "" ) ) ) );
}
try {
    myVal = decodeURIComponent(sourceVal);
} catch (err) {
    myVal = "";
}