【问题标题】:ISO to UTF-8 on RESTful serverRESTful 服务器上的 ISO 到 UTF-8
【发布时间】:2012-10-01 06:31:46
【问题描述】:

我有一个 RESTful 服务,它要求请求中有一个字符串。从浏览器传递字符串时,重音字符会出现乱码 (�),因为默认浏览器编码是 ISO-8859-1。如果我将浏览器编码更改为 UTF-8,重音字符会保留在请求字符串中。

有没有办法在服务器端更改字符串编码并以 UTF-8 重新构造字符串,这样我就不需要每次都更改浏览器编码?

谢谢

【问题讨论】:

  • 带有表单的页面应该在 HTTP 标头的元标记中指定编码。如果您的用户需要从浏览器菜单中手动更改编码,那您就大错特错了。
  • 您确定您没有得到相反的结果,并且浏览器正在向您发送 UTF-8 内容吗?大多数浏览器默认发送 UTF-8 的内容,问题是 J2EE 规范说 java 中的默认编码是 ISO-8859-1,这引起了很多悲痛。
  • 这不是 J2EE 规范,而是 HTTP 标准 - w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1

标签: java rest utf-8 jersey iso


【解决方案1】:

我发现大多数浏览器的默认编码取决于它们所安装的系统。我的大部分(尤其是在 Windows 上)默认为 ISO-8859-1 或 CP1252,这与这个原始帖子相对应。确保您的 http 标头和 html 元标记指定 UTF-8 编码,并确保您的 servlet 容器默认设置为使用 UTF-8(如果您使用的是 tomcat,请参阅http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8)。

有时您仍然会通过使用(例如)CP1252 将应用程序的复制粘贴来逐位粘贴到 UTF-8 页面上的文本区域中。我从来没有让这个工作没有乱码。

【讨论】:

  • 默认情况下,Firefox 和 IE 能够正确传递重音字符。在 Chrome 上,编码必须更改为 UTF-8 才能正常工作。
【解决方案2】:

UTF-8 编码标准能够编码任何 Unicode 代码点。 ISO-8859-1 只能处理其中的一小部分。因此,从 ISO-8859-1 转码到 UTF-8 不是问题。当发现不受支持的字符时,从 UTF-8 倒退到 ISO-8859-1 将导致“替换字符”(�) 出现在您的文本中。要对您的测试进行转码,您可以这样做:

byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");

byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2020-04-05
    • 2012-12-22
    • 1970-01-01
    • 2013-12-31
    • 2011-06-11
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多