使用Eclipse处理非英语字符

时间:2015-06-07 08:13:32

标签: java eclipse

以下是我想使用Eclipse在NSArray文件中粘贴的文本。

bundle.properties

而Eclipse以unicode转义表示法显示这些字符,如下所示: Честит рожден ден

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 PropertyResourceBundle依赖于Properties类,该类的load方法始终假定要编码的文件是 iso-latin-1 ¹:

  

输入流采用load(Reader)中指定的面向行的简单格式,并假定使用ISO 8859-1字符编码;即每个字节是一个Latin1字符。 Java™语言规范的第3.3节中定义,使用Unicode转义在键和元素中表示不在Latin1中的字符和某些特殊字符。

因此在正确的情况下将您复制的字符转换为Unicode转义序列,以确保将其正确加载。在运行时,ResourceBundle将包含正确的字符内容。

在Eclipse中,源文件通常从其父级继承字符集设置,以结束于项目甚至是系统范围的设置,它支持为单个文件设置字符集编码,并方便地将其自动更改为iso-latin-1 .properties个文件。

请注意,从Java 9开始,您可以将 UTF-8 用于属性资源包。这不需要额外的配置操作,因为字符集编码是通过探测确定的。正如documentation of the PropertyResourceBundle(InputStream) constructor所述:

  

此构造函数默认情况下以UTF-8读取属性文件。如果在读取输入流时发生MalformedInputException或UnmappableCharacterException,则PropertyResourceBundle实例将重置为异常之前的状态,然后重新读取ISO-8859-1中的输入流并继续读取。如果将系统属性java.util.PropertyResourceBundle.encoding设置为“ ISO-8859-1”或“ UTF-8”,则仅以该编码方式读取输入流,如果遇到无效序列,则将引发异常。

这是可行的,因为两种编码对于ASCII字符都是相同的,而对于非ASCII序列,对于现实生活中的文本,iso-latin-1序列形成有效的UTF-8序列实际上几乎不会发生。这适用于PropertyResourceBundle来处理此探测,而不适用于Properties类,该类仍仅在其load(InputStream)方法中使用iso-latin-1。

¹为了简化起见,我以绝对形式保留了该语句,尽管正如该答案末尾所阐述的那样,Java 9取消了这一限制。