以下是我想使用Eclipse在NSArray
文件中粘贴的文本。
bundle.properties
而Eclipse以unicode转义表示法显示这些字符,如下所示:
Честит рожден ден
如何解决此问题?
答案 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取消了这一限制。