JCA部署描述符(ra.xml)字符编码应该是什么?

时间:2015-05-12 13:32:17

标签: character-encoding xml-parsing findbugs jca deployment-descriptor

浏览JCA 1.7 specification我只能在他们的资源适配器Deployment Descriptor中的一个示例中找到以下内容(第13章:消息流入P 13-50): JCA DD example showing UTF-8 encoding 此示例显示了UTF-8编码的用法,但是如果这是示例说明的可选选项或文件字符编码的必须限制,则没有任何说法。

我之所以这样问,是因为我正在编写Java程序来阅读其中一个文件而FindBugs™正在给我这样的信息:

  

DM_DEFAULT_ENCODING:依赖于默认编码   找到一个方法的调用,该方法将对String执行一个字节(或   字符串到字节)转换,并将假定为默认平台   编码是合适的。这将导致应用程序行为   因平台而异。使用备用API并指定charset   明确地命名或Charset对象。

此Java代码段中的第4行是指定字符编码的位置:

01.  byte[] contents = new byte[1024];
02.  int bytesRead = 0;
03.  while ((bytesRead = bin.read(contents)) != -1)
04.     result.append(new String(contents, 0, bytesRead));

那么,在这种情况下是否可以指定此文件的预期编码?

2 个答案:

答案 0 :(得分:2)

从我看到的,大多数人使用UTF-8编码作为他们的ra.xml。但是,使用其他编码没有限制。因此,如果您的解析仅基于UTF-8,则结果可能与预期不符。

因此,当您将其作为普通文本阅读时,您需要在代码中对此进行计数,或将其作为xml文件读取并避免头痛。我不认为性能上的差异会成为一个问题,因为ra.xml文件通常不会增长到千兆字节。至少我到目前为止看到的平均只有几兆字节。

对于Findbug问题,您只需将编码指定为UTF-8即可。否则,您将使用在虚拟机启动期间确定的JVM的默认值,通常取决于底层操作系统的区域设置和字符集。虽然这里不推荐使用默认行为,但如果这是你想要的,那么只需指定默认编码的用法。这将摆脱Findbug问题。

所以你的代码看起来像这样:

01. byte[] contents = new byte[1024];
02. int bytesRead = 0;
03. while ((bytesRead = bin.read(contents)) != -1)
04.     result.append(new String(contents, 0, bytesRead, Charset.defaultCharset()));

答案 1 :(得分:1)

FindBugs只是警告您,您依赖于默认的系统编码,因此,如果您的应用程序将由另一个国家/地区的其他用户启动,则可能会出现意外结果。最好明确指定要使用的编码。

在您的情况下,应从XML文件中提取实际编码。有几种方法可以获得它。一种方法是使用this回答中描述的XMLStreamReader