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

Character encoding JCA部署描述符(ra.xml)字符编码应该是什么?,character-encoding,xml-parsing,findbugs,jca,deployment-descriptor,Character Encoding,Xml Parsing,Findbugs,Jca,Deployment Descriptor,通过查看,我只能在资源适配器上的一个示例中找到以下内容(第13章:消息流入p 13-50): 本例显示了编码的用法,但是没有说明这是示例说明的可选选择还是文件字符编码的必须限制 我问这个问题是因为我正在编写一个Java程序来读取其中一个文件,并向我传达了以下信息: DM_DEFAULT_编码:依赖默认编码 找到对方法的调用,该方法将执行字节到字符串(或 字符串到字节)的转换,并将假定默认平台 编码是合适的。这将导致应用程序行为异常 不同的平台。使用替代API并指定字符集 显式命名或字符集对象 此

通过查看,我只能在资源适配器上的一个示例中找到以下内容(第13章:消息流入p 13-50): 本例显示了编码的用法,但是没有说明这是示例说明的可选选择还是文件字符编码的必须限制

我问这个问题是因为我正在编写一个Java程序来读取其中一个文件,并向我传达了以下信息:

DM_DEFAULT_编码:依赖默认编码 找到对方法的调用,该方法将执行字节到字符串(或 字符串到字节)的转换,并将假定默认平台 编码是合适的。这将导致应用程序行为异常 不同的平台。使用替代API并指定字符集 显式命名或字符集对象

此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));

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

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


在您的例子中,实际编码应该从XML文件中提取。有几种方法可以得到它。一种方法是使用回答中所述的
XMLStreamReader

据我所见,大多数人对其ra.xml使用UTF-8编码。但是,对使用其他编码没有限制。因此,如果您将解析建立在仅期望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()));

UTF-8很好。你能告诉我你得到FindBugs警告的代码吗?@Thomas这与UTF-8的好坏无关:)更多的是关于用户是否可以指定其他字符编码。为了方便起见,我提供了一个示例代码。如果使用
新字符串(contents,0,bytesRead,StandardCharsets.UTF_8)
,FindBugs警告应该会消失。您应该在XML头和代码中指定相同的字符集。我不知道必须使用UTF-8的限制。@Thomas我无法控制XML文件编码,因为它是由最终用户提供给我的。在读取之前,是否有办法确定文件的字符编码?为什么需要将XML作为字节流读取并手动将其转换为
String
?为什么不使用现成的DOM/SAX解析器?他们将根据XML文件头自动切换编码。