Java运行时不支持UTF-8编码。

12
每当我在SUN Java(构建1.6.0_10-rc2-b32和其他1.6.x版本)下启动我们基于Apache Felix(OSGi)的应用程序时,我会在控制台上看到以下消息输出(通常在Ubuntu 8.4下):

警告:Java运行时不支持编码'UTF-8'。

我也曾在运行Tomcat和Resin时偶尔看到这个消息。如果Java支持Unicode和UTF-8,那是什么原因导致出现这个消息?我还没有在其他地方找到任何参考资料或答案。

这是哪个Java的实现?是哪个版本的Java?这些Java应用程序(是你编写的还是我们知道的开源应用程序)? - anjanb
奇怪。UTF-8是必需的编码方式。没有人应该发布不包括UTF-8和US-ASCII的Java运行时。 - erickson
可能是底层操作系统缺少某些东西吗? - skaffman
我收到了相同的信息,但是在不同的环境中。我发现它来自于 Transformer 的 transform 方法,当 Transformer 的实现为 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl 时。 - John Snyders
任何人都不应该在生产系统上使用 RC 版本 :) - Michael Borgwardt
我在启动PyCharm 3.1.3时遇到了相同的错误消息。虽然不确定在运行IDE时是否会产生任何负面影响。 - user1603472
7个回答

12
根据文档,“Java 平台的每个实现都必须支持以下标准字符集…US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16。”因此我怀疑 Sun 没有发布不支持 UTF-8 的版本。
实际的错误信息似乎来自这里,这是 Xerces XML 解析器的一部分。我认为问题出现在 XML 解析器中。

3
在我的实例中,问题源于使用OSGi和类加载器可见性。多个捆绑包实例化了Xerces XML解析器,但由于这些资源不可见,无法找到字符集定义。 - Mark Derricutt
请提供那些不可见的软件包。你需要让哪些软件包可见? - Mike Pone
2
如果这是解决方案,它是如何解决问题的?您能否具体说明您所做的事情?该问题发生在Fuse ESB 4.4的日志系统中。 - Danubian Sailor
是的,我可以证实这来自Xerces...但我找不到任何真正的修复或解决方法。 - Chucky

7

尝试以下程序:

import java.nio.charset.Charset;

public class TestCharset {
    public static void main(String[] args) {
        System.out.println(Charset.forName("UTF-8"));
    }
}

如果抛出异常,则表示您的JDK存在问题。如果打印“UTF-8”,则说明您的JDK正常,但应用程序存在某些奇怪的问题。
如果是这种情况,请在调试器下运行您的应用程序,并在http://www.java2s.com/Open-Source/Java-Document/XML/xalan/org/apache/xml/serializer/ToStream.java.htm中设置断点--这是产生此警告的地方,并逐步查看为什么Xalan无法找到编码。

2

很可能有人添加了一个catch()来捕获仅不支持的编码异常,并使用了适当的消息。但是他使用了太宽泛的异常规范(例如,catch(Exception ex)),因此当在运行时遇到其他东西(非有效的XML,NPE等)时,消息变得具有误导性。


0
如果您在使用Transformer时遇到此消息,请尝试指定TransformerFactory:

link


0

尝试使用不同的(稳定版本)JVM。我曾经遇到过这个问题,结果发现机器正在运行一个测试版JVM,与API文档中的要求相反,确实不支持UTF-8。


0

0
应该是“UTF8”,没有破折号。

2
鉴于Dan Dyer的回答,我不认为是这种情况。你有参考资料吗? - Michael Myers
迈克尔是正确的 - 有点。JDK源代码在各种NIO、NIO2和普通IO包中混合使用了UTF8和UTF-8引用。真的很糟糕。 - Mark Derricutt

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