使用ISO-8859-1编码对JavaScript字符串进行encodeURIComponent

3

我一直在尝试使这个工作,但到目前为止还没有成功。

我不是很清楚发生了什么,但我会尽力详细说明。

我的服务器端jsp页面都使用ISO-8859-1编码,我不想改变。

所有请求/响应都以xml形式进行。

当前的POST请求正在使用javascript的escapeURIComponent函数,而且一切正常,直到出现特殊字符,例如字符串:hello°world©®™test。当这个字符串(经过escapeURIComponent处理)从IE POST(到数据部分)时,重新加载页面就应该得到相同的字符串,但却显示为:hello°world©®™test。

我认为这是因为encodeURIComponent函数将字符串编码为UTF-8,而不是ISO-8859-1,当页面呈现时,UTF-8被解释为ISO-8859-1字符,因此显示乱码。

有没有办法在不将网页转换为UTF-8字符集的情况下解决这个问题?

POST请求的Content-Type设置为"application/x-www-form-urlencoded"。

谢谢您提前的帮助。

1个回答

10
首先,作为一项原则的普遍问题,我强烈建议您放弃对ISO-8859-1的忠诚,并转换为UTF-8。但这不会解决您目前的问题,所以我们留到另一天再进行讨论。 encodeURIComponent始终使用UTF-8编码,这是无法更改的。尽管您可以手动修改encodeURIComponent产生的百分号编码,但我认为这不是一个有效的时间利用方式。
从您的描述中,我认为问题实际上更早出现了:您的服务器认为该字符串中有那些Â字符,因此会向您的浏览器发送显示这些字符所需的代码。仅仅更改服务器输出的编码将导致服务器发送UTF-8代码来代替Â字符,而无法真正帮助解决问题。
因此,问题在于:如何告诉服务器传入的数据是百分比编码的UTF-8,而不是像服务器似乎认为的百分比编码8859-1?
您没有在文章中指定您正在发送的字符串是否作为URL的一部分(也就是说,您正在POST到某个URL,如http://myserver/mypage.jsp?theString=hello%C2%B0world%C2%A9%C2%AE%E2%84%A2test),还是作为POST正文的一部分。通常情况下,您会将数据作为POST正文的一部分发送。如果是这种情况,请尝试添加
<% request.setCharacterEncoding("UTF-8"); %>

在你的jsp页面顶部添加以下代码- 通知服务器把传入请求解析为UTF-8格式,即使传出内容仍然是8859-1。如果这个页面上有任何指向<form>元素,你应该向表单中添加一个accept-charset属性,并将其设置为"UTF-8"。

如果你所传递的东西恰好在URL本身中,那么你需要在使用的任何servlet容器上设置URIEncoding; 如果是Tomcat,请参见这个问题的答案


1
<% request.setCharacterEncoding("UTF-8"); %> 已经生效。谢谢! - user1719160
你也可以使用"escape()"代替"encodeURIComponent()"。 - David Gallardo

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