【问题标题】:Servlet gets weird character with US International keyboard on MacServlet 在 Mac 上使用美国国际键盘获得奇怪的字符
【发布时间】:2012-04-28 21:24:30
【问题描述】:

我有一个简单的表格,可以输入一些字符。这些字符被发送到执行 getBytes 并打印字节的 servlet。 “ã”的正确 UTF-8 字节是 -61 和 -93,但我得到 -52 和 -93。 :(

我尝试了一切来理解和解决这个问题,但没有任何效果。我机器上的所有内容都应该是 UTF-8,所以我怀疑这与我使用了 20 年的美国国际键盘有关。

任何聪明的灵魂都知道-52和-93是从哪里来的吗?

已在 Jetty 上修复:请参阅下面的答案。

在 Tomcat 上损坏:How to get tomcat to understand MacRoman (x-mac-roman) charset from my Mac keyboard?

【问题讨论】:

  • 在字符串上调用getBytes() 并不是确定实际发送什么的好方法。使用 Wireshark 或类似的东西。

标签: java servlets character-encoding special-characters


【解决方案1】:

那是Mac OS Roman character encoding。 (0xBB == -52。)

需要检查的一些事项:

  • getBytes(string, "UTF-8")new String(bytes, "UTF-8")
  • 表单应该以 UTF-8 格式发送:response.setContentType("text/html; charset="UTF-8");。在 JSP 中<%@page pageEncoding="UTF-8"%>
  • <form action="..." accept-charset="UTF-8">

所有这些都没有帮助:

在您的 Web 应用程序 (web-xml) 中设置 request filtering


pom.xml 中的编码:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>...</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>${project.build.sourceEncoding}</encoding>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>...</version>
    <configuration>
        <encoding>${project.build.sourceEncoding}</encoding>
    </configuration>
</plugin>
...
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

【讨论】:

  • 谢谢乔普,但它不起作用。我的猜测是无论我做什么,Web 容器都会获取 Mac OS Roman 并且不知道如何处理它。我的浏览器编码设置为 UTF-8。 :(
  • 作为“页面信息”,您可能会看到实际的编码。接受字符集可以在“页面源代码”中看到。后者可能被遗忘了。或者您可能有一个非常旧的浏览器。也许&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt; 可能是最后的手段。
  • 有趣的是,对于一个字符,你会得到两个字节,所以 UTF-8 完成了(虽然是错误的)。但是在某个地方你会得到 Mac Roman,并且完成了 ISO-8859-1 到 UTF-8 的转换。您是否尝试使用其他浏览器?你追踪request.getEncoding()了吗?
  • 我做了你建议的一切。我正在对我在 servlet 中得到的字符串执行 System.out.println。它打印不正确。在 Jetty 和 Tomcat 上测试。 :(
【解决方案2】:

好的,经过 8 小时(严重!)之后,看起来要让它正常工作的唯一方法是:

其中一个问题是:bad maven build encoding 编译类文件。

export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
mvn clean install

与:

   <%@page pageEncoding="UTF-8" %>

现在:

无法知道在 pom.xml 中传递后一个选项。

这是一个待定的答案:enabling UTF-8 encoding for clojure source files

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多