【问题标题】:Uncaught URIError: URI malformed - jquery UI tabs on Windows未捕获的 URIError:URI 格式错误 - Windows 上的 jquery UI 选项卡
【发布时间】:2013-03-10 19:52:04
【问题描述】:

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

<div id="tabs">
  <ul>
    <li><a href="#tabs-1">Nunc tincidunt</a></li>
    <li><a href="#tabs-2">Proin dolor</a></li>
    <li><a href="#tabs-3">Aenean lacinia</a></li>
  </ul>
  <div id="tabs-1">
    <p>Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. </p>
  </div>
  <div id="tabs-2">
    <p>Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie</p>
  </div>
  <div id="tabs-3">
    <p>Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede ve</p>

  </div>
</div>

问题是我在这个函数上得到一个“Uncaught URIError: URI malformed”:

function isLocal( anchor ) {
    return anchor.hash.length > 1 &&
        decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
Uncaught URIError: URI malformed
            decodeURIComponent( location.href.replace( rhash, "" ) );
} 

我怀疑这是由于 windows 环境中的 URI 看起来像这样:

file:///C:/Work/my%20project/yadda%20ac%E7%F5es%20yadda/submenu.html#tabs-1

我怎样才能让它在本地 Windows 上工作,因为我的客户希望在上线之前看到它在那里工作?我已经测试过,我知道这是由 uri 上的特殊字符的编码引起的(比如“acções”这个词)。 有没有办法让它在使用特殊字符时也能正常工作

我知道我可以通过删除这些字符并重命名文件/文件夹来解决此问题,但我希望有一个更能证明客户的解决方案,以防他们决定再次重命名文件夹(一切都只是 CABOOM在他们的脸上)。

【问题讨论】:

  • 你的代码是纯 HTML/JavaScript 吗?没有服务器端代码?你能在演示机器上运行一个小型 Web 服务器来避免 file:// URL 的问题吗?
  • 这是一个错误bugs.jqueryui.com/ticket/9518 存在于非UTF8 URL。有人知道非 UTF8 网站的解决方法吗?
  • 我对这个问题进行了一些调查,它导致了不同的问题 - how these non UTF-8 characters got to the URIs and should they be there or not?。请参阅随附的测试用例。
  • 我将演示代码粘贴到记事本中并保存为 test1.html 在我的桌面上双击它,它可以正常工作。
  • @danny117,你说的是哪个演示代码?请发表明确的答案。

标签: javascript jquery html jquery-ui uri


【解决方案1】:

这是 decodeURIComponent 方法的结果,该方法假定给定字符串的百分比编码字节采用 UTF-8 格式(参见 ECMAScript 第 15.1.3 节中Decode operation 的步骤 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 标记:

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

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

并确保网页本身以 UTF-8 编码。


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

【讨论】:

  • 将页面的编码更改为 UTF-8 并不总是可行的!
【解决方案2】:

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

decodeURIComponent( unescape( unescape(s)) )

更一般地说,可能应该有重复直到循环,直到你不断得到相同的结果。这种解决方法肯定不是一个干净的解决方案。这里询问干净的解决方案:

Submit form with get method in non UTF-8 encoding

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, "" ) ) ) );
}

【讨论】:

    【解决方案3】:

    这样的?

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

    【讨论】:

    • 嗯...unescapebeing frowned upon,所以它可能不是干净的解决方案。正确的问题是:为什么 decodeURIComponent 在非 UTF8 URI 上失败? URI 中是否允许使用这些字符编码? RFC3986 这个非 UTF-8 URI 是由我的浏览器 (Firefox) 通过在非 UTF-8 页面上提交表单创建的。所以在某些标准软件中一定存在错误!
    • 我对这个问题进行了一些调查,它导致了不同的问题 - how these non UTF-8 characters got to the URIs and should they be there or not?。请参阅随附的测试用例。
    • 看起来其他线程/问题解决了吗?似乎问题出在 ISO 格式编码中,但应该是 utf8。我做了一个快速的谷歌搜索,发现这个转换功能似乎与您的表单示例很好地配合使用。 pastebin.com/cXqQpGwL
    • 谢谢,很有趣。为什么他们不使用表单元素的accept-charset="utf-8" 属性?它似乎做同样的工作,不是吗?
    • 我终于修补了我的 jqueryui 并使用您的解决方案作为解决方法,但我不得不使用它两次,因为我有一些包含编码 URIS 的 URI 参数。所以我的解决方案是decodeURIComponent( unescape( unescape(s)) )。更一般地说,你可能应该是repeat-until 循环,直到你不断得到相同的结果。这显然不是一个干净的解决方案。 The clean solution is asked here.
    【解决方案4】:

    我遇到了同样的错误“未捕获的 URIError:URI 格式错误”,我通过以下方式修复了它:

    decodeURIComponent(encodeURIComponent(mystring))

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

    【讨论】:

      【解决方案5】:

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

      try {
          myVal = decodeURIComponent(sourceVal);
      } catch (err) {
          myVal = "";
      }
      

      【讨论】:

      • 这不是解决方案@Aryeh
      【解决方案6】:

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

      你显然改变了一些东西,无论它是什么改变它都可以正常工作。

      【讨论】:

      • 丹尼,你说的不是很清楚。请澄清您的答案-您的意思是哪个演示。也许它工作正常,因为您更改了文件的编码?最好描述一下您的更改是什么。
      • @Tomas 是第一个链接。你知道它在哪里说“演示代码”。我只是说如果你不能复制错误,你就无法修复它。
      • 您错过了重点 - 您必须在 URI 中包含非 UTF-8 字符,因此另存为 test1.html 显然无法正常工作。您应该按照整个 过程来重现它。你也可以在这里stackoverflow.com/q/19702662/684229关注我的测试用例。
      • @Tomas 我刚刚尝试将文件夹命名为 file:///C:/Users/daniel/Documents/ac%C3%A7%C3%B5es/test1.html#tab-1 它仍然为我工作。太疯狂了,但是当您将链接粘贴到这个疯狂的文本框中时,它会逃脱它,而 Firefox 会将其放回原处。我只是无法复制错误,因此无法单步执行代码并修复它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2013-04-24
      相关资源
      最近更新 更多