【问题标题】:Handling non-english characters using Eclipse使用 Eclipse 处理非英文字符
【发布时间】:2015-06-07 08:13:31
【问题描述】:

下面是我想使用 Eclipse 粘贴到 bundle.properties 文件中的文本。

Честит рожден ден

Eclipse 会以 unicode 转义符号显示这些字符,如下所示: \u0427\u0435\u0441\u0442\u0438\u0442 \u0440\u043E\u0436\u0434\u0435\u043D \u0434\u0435\u043D

我该如何解决这个问题?

【问题讨论】:

  • eclipse 安装和文件的默认编码是什么?
  • properties 文件应该以 ISO-8859-1 编码,它不支持您的字符。这就是为什么需要 unicode 转义序列的原因。将鼠标悬停在属性上,或按 F2,会显示“原始”文本。但我认为您无法在 Eclipse 的编辑器中查看原始文本。 IntelliJ 可以做到这一点。
  • @NwDx cp1252 是当前的编码
  • 这是错误的,因为您使用西里尔字符将全部转换为 utf-8。可以通过这个来完成:stackoverflow.com/questions/3751791/… 或者那个:stackoverflow.com/questions/9180981/…
  • @NwDx 但在当前设置下,如果我在该 Unicode 表示法上执行 system.out.printtln,则会打印为实际的保加利亚字符。我怎么理解这个?

标签: java eclipse


【解决方案1】:

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

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

因此,正确地将复制的字符转换为 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 已解除此限制。

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 2012-08-19
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多