Java Servlet:如何处理未知编码?

时间:2009-06-05 17:24:22

标签: java encoding servlets

当某个用户试图查看我们的网页时,当我们调用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'的请求标头时,我终于能够重现这个错误,这是用户的浏览器似乎所做的。

这是网络服务器代码所以我不能在这里进行任何更改,但是我们可以在最后确保这一点,以确保永远不会发生这种情况。我们是否可以明确强制网络服务器使用某种编码而不是将其留给请求?

2 个答案:

答案 0 :(得分:1)

MacRoman是一个“国际字符集”,它并不总是由Sun Java安装程序安装,因此程序无法使用。

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

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

答案 1 :(得分:0)

您可以创建一个过滤器和一个新请求(使用请求包装器),它总是响应“有效”字符编码,用于“有效”的各种值。实际上,这就是他们尝试使用MIME2Java.convert()调用时所做的事情,但你必须“尽早”并截取它,以确保你能更好地控制编码。