2

我们有一个在 Weblogic 服务器上运行的 Java 应用程序,它从 JMS 或 MQ 队列中提取 XML 消息并将其写入另一个 JMS 队列。应用程序不会以任何方式修改 XML 内容。我们使用 BEA 的 XMLObject 来读取消息并将消息写入队列。

XML 消息包含编码类型声明为 UTF-8。

当 XML 包含超出正常 ASCII 范围的字符(例如 £ 符号)时,我们会遇到问题。当从队列中读取消息时,我们可以看到 £ 符号是完整的,但是一旦我们将其写入目标队列, £ 符号就会丢失并被替换为 £。

我检查了操作系统级别设置(区域设置),一切似乎都很好。我还应该检查什么以确保不会发生这种情况?

4

3 回答 3

5

一旦我们将其写入目标队列,£ 符号就会丢失并被替换为 £

这告诉我该字符被为 UTF-8,但它被读取为好像它是像 ISO-8859-1 这样的单字节编码。(对于 U+00A0..U+00BF 范围内的任何字符,如果将其编码为 UTF-8 并将其解码为 ISO-8859-1,则最终会得到两个字符序列ÃX,其中X是原始字符。 ) 我会查看接收 JMS 队列的编码设置。

于 2008-11-06T19:08:06.113 回答
3

您应该使用InputStreamOutputStreambyte[]来处理 XML 文档,而不是ReaderWriterString。在 JMS 的世界中,BytesMessageTextMessage.

每个 XML 文档都在内部指定其字符编码,并且所有 XML 处理 API 都面向获取字节流,并在必要时找出正确的字符编码以供自己使用。基于文本的 API 只是在那里......我猜是为了迷惑人们!无论如何,应用程序应该让 XML 处理器处理字符编码问题,而不是试图自己管理它(或使用面向文本的 API,而对字符编码问题没有深入的了解)。

于 2008-11-06T19:24:37.580 回答
2

如果没有更多细节,我猜有一种方法可以选择在未指定的地方进行编码,并且默认为 ISO-8859-1。通常,检查 InputStream/OutputStream 和 Reader/Writer 之间传递的任何内容。

例如,OutputStreamWriter采用您可以省略的可选编码。

于 2008-11-06T16:04:43.240 回答