Internet Explorer中URL转义中文/日文Unicode字符

9
我正在尝试对多个URL中的非ASCII字符进行URL转义(百分号编码)。我正在使用一个Flash应用程序,从这些URL加载资源,如图像和声音片段。由于文件名可能包含非ASCII字符,例如: 日本語.jpg 我通过对字符进行UTF-8编码,然后对Unicode字节进行百分号编码来对它们进行转义,以获得以下结果: %E6%97%A5%E6%9C%AC%E8%AA%9E.jpg 当我在除Internet Explorer之外的任何浏览器中运行应用程序时,这些文件名都可以正常工作,我已经尝试过Firefox、Safari和Chrome。但是,当我在IE中启动应用程序并尝试加载声音片段时,我会收到错误#2044:未处理的ioError,并且URL已被损坏为以下内容: æ¥æ¬èª.jpg 有什么想法可以解决这个问题吗?这只是使用本地文件系统URL测试驱动Flash应用程序。
我还注意到Internet Explorer无法定位文件,例如: file:///C:/%E6%97%A5%E6%9C%AC%E8%AA%9E.jpg,虽然Chrome/Firefox将对其进行解码并正常加载路径为 C:\日本語.jpg 编辑
import flash.display.Loader;
import flash.net.URLRequest;
...
var ldr:Loader;
var req:URLRequest = new URLRequest("日本語.jpg");
ldr = new Loader();
ldr.load(req);

使用字符串日本語.jpg在IE中可以正常工作,而使用字符串%E6%97%A5%E6%9C%AC%E8%AA%9E.jpg则可以在其他浏览器中正常工作。我需要的是一个能在所有浏览器中正常工作的表单。我已经尝试过使用%u编码和将http请求头设置为Content-Type: text/html; charset=utf-8,但无论是百分号转义还是未转义都没有成功。

Windows使用UTF-16编码来表示文件名。因此,尝试使用%65%E5%67%2C%8A%9E - Gumbo
UTF-16 的名称不行,IE 依然找不到它。 - Bear
related: https://dev59.com/OXVD5IYBdhLWcg3wI3-L - cregox
6个回答

1

file:// 协议取决于您的操作系统区域设置,如果您的系统设置不是中文而是英文,则无法让 IE 进行此操作。


1

抱歉,没有解决方案,但也许可以提供一些关于可能发生的情况的更多信息。(可能你已经弄清楚了这么多,但也许它会帮助另一个读者找到解决方案。)“官方”的URL编码规范似乎为如何解码像您生成的转义URL敞开了大门——转义实体是用来表示UTF-8字符(如Firefox等解释它们),还是ASCII字符(如IE解释它们)?我不知道有什么方法可以强制使用预期的解码策略。

只是一个问题:如果您根本不转义它们,而是将Unicode保留在URL中,会发生什么坏事?虽然我没有太多的经验,但我记得在某个地方读过,需要在URL中转义Unicode的日子已经过去了。可能我错了...


大多数浏览器似乎都可以处理包含Unicode字符的URL。但是我正在构建一个Flex应用程序,我的URL是指向外部资源(如声音剪辑、图像、电影等)的链接。当我在Flash插件中运行编译后的.SWF文件时,只有在使用URL /百分比转义UTF-8的Unicode字符时,这些资源才会加载。否则它们就无法加载。这些百分比转义的文件名在除Internet Explorer之外的所有浏览器中都可以正常工作。 - Bear
URI/URL(RFC 3986)要求对非ASCII字符进行编码。另一方面,IRI(RFC 3987)允许使用大多数Unicode字符而不进行编码。IRI是取代旧的URI/URL标准的新标准,但许多系统尚未实现IRI。IRI规范提供了将IRI转换为URI/URL以及反向转换的规则。 - Remy Lebeau

1

IE使用UTF-8编码HTTP URL,但我不确定文件URL是否也是如此(尽管我在大约10年前作为IE团队的一部分测试了其行为)。如果您在HTML中使用URLS,我实际上建议尝试使用字符串文字(如果您的页面编码为UTF-8)或数字字符引用(&#dddd;)。IE通常会将字符转换为适当的编码,HTTP部分为UTF-8,本地文件系统交互为UTF-16。

实际上需要进行URL转义的是HTTP,而不是HTML解析器。


1

尝试仅对可能导致URI解析不正确的部分进行编码。例如,对&、?和空格进行编码。将其他所有内容保持不变,它应该能够完美运行。

如果您仍然遇到问题,则可能需要在HTTP标头中将内容类型设置为utf。类似于Content-type:text / html; charset = UTF-8。


不幸的是,我正在使用的框架 - Flex - 对未转义的非 ASCII 字符处理得不太好。我需要找到一个适当的解决方法。我将在 Flex 框架中查找是否可以访问 HTTP 标头,但我希望有一个更高级别的解决方案。 - Bear

1

为什么不直接使用Unicode转义序列呢?将此粘贴到HTML网页的正文中,就可以看到我的意思了:

   <script type="text/javascript">
      var fileName = "日本語.jpg";
      document.write(escape(fileName));
   </script>

我得到了 %u65E5%u672C%u8A9E.jpg。


这些对我来说不起作用。这是一种标准的URL转义方式吗?Firefox无法加载以下形式的URL: file:///.../%u3400.jpg,对于给定路径上名为㐀.jpg的文件。 - Bear
抱歉,我想这个只适用于JavaScript的escape/unescape。我尝试了你的编码,在我的本地主机上可行。就像其他地方提到的一样,你可能需要在头部信息中告诉服务器你正在发送UTF-8编码。 - Ishmael
如果您的宿主页面有编码元标记,那应该足以让服务器相信您正在使用UTF-8,我想。也许。 - Ishmael

1

从我的测试中,我注意到IE不会处理编码的文件URL,但它会处理普通的http URL,所以这可能是问题所在。我不确定你是如何加载它们的,但你应该检查一下这个问题。


这似乎是个问题。Flash Active-X控件(IE)只能加载未编码的文件URL,而Flash插件(Chrome,Firefox,Safari等)只能加载编码的文件URL。到目前为止,我想到的唯一解决方法是:如果Flash播放器是Active-X 使用未编码的URL 否则 使用编码的URL如果你问我,这有点hacky。 - Bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接