【问题标题】:Java Servlet: How to handle unknown encodings?Java Servlet:如何处理未知编码?
【发布时间】:2009-06-05 17:24:21
【问题描述】:

当某个用户尝试查看我们的网页时,当我们调用 response.getWriter() 时,会引发带有消息“charsetName”的 NullPointerException。我反编译了我们的 Web 服务器的响应类(JRun 3.1),发现这样做时会抛出这个错误:

s = getCharacterEncoding(); // returns 'x-mac-roman' I believe
try
{
    outWriter.exchangeWriter(new OutputStreamWriter(bufStream, s));
}
catch(UnsupportedEncodingException unsupportedencodingexception)
{
    s = MIME2Java.convert(s); // looks like this returns null
    outWriter.exchangeWriter(new OutputStreamWriter(bufStream, s)); // NPE!!!
}

当我强制我的浏览器发送“Accept-Charset=x-mac-roman,utf-8”的请求标头时,我终于能够重现此错误,这似乎是用户的浏览器所做的。

这是网络服务器代码,因此我无法在此处进行任何更改,但我们可以在此处做一些事情来确保这种情况永远不会发生。我们可以显式地强制网络服务器使用某种编码,而不是由请求决定吗?

【问题讨论】:

    标签: java encoding servlets


    【解决方案1】:

    MacRoman 是一种“国际字符集”,Sun Java 安装程序并不总是安装它,因此对程序不可用。

    根据http://java.sun.com/javase/6/docs/technotes/guides/intl/encoding.doc.html,如果安装程序确定它是“欧洲”操作系统,则不会执行此操作。

    如果您重新安装 Sun Java 并在自定义安装中请求支持非欧洲语言,则应该更正此问题。

    【讨论】:

      【解决方案2】:

      您可以创建一个过滤器和一个新请求(使用请求包装器),该请求始终响应“有效”字符编码,用于各种“有效”值。实际上,这就是他们试图对 MIME2Java.convert() 调用执行的操作,但您必须“尽早”执行此操作并拦截它以确保您可以更好地控制编码。

      【讨论】:

        猜你喜欢
        • 2017-01-21
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        • 2014-03-11
        相关资源
        最近更新 更多