0

我有一个属性文件,它的键值中可能/可能不包含 unicode 转义字符。请参阅下面的示例。我的工作是确保如果属性文件中的值包含非 ascii 字符,那么它应该是 unicode 转义的。因此,在下面的示例中,第一个条目是可以的,所有像第二个条目一样的条目都应该被删除并转换为像第一个条目一样。

##sample.properties
escaped=cari\u00F1o
nonescaped=cariño
normal=darling

从本质上讲,我的问题是如何在 Java 中区分cari\u00F1ocariño,因为就 Java 而言,它将它们视为相同。

4

4 回答 4

2

Java 中的属性文件必须以 ISO-8859-1 字符集保存,Java 才能正确读取它们。这意味着可以使用西欧语言中的特殊字符而不转义它们。如果不转义它们,就不可能使用来自其他语言的字符,例如来自复活节欧洲、俄罗斯或中国的字符。

因此,只有少数非 ascii 字符可以出现在属性文件中而不会被转义。

要检测字符是否被转义,您需要直接打开属性文件,而不是通过 Properties 类。当您通过它加载文件时,Properties 类会为您完成所有转义。您应该使用 File 类或通过 System.getResourceAsStream 作为 InputStream 打开它们。一旦你这样做了,你可以一次扫描输入流一个字节,并确保所有字节都在 0x20-0x7E 范围内加上新行 \r 和 \n 这是你在属性文件中期望的字符的 ASCII 范围.

我建议您的翻译人员不要尝试直接编写属性文件。他们应该为您提供您转换为属性文件的电子表格等文档。或者他们可以使用诸如 Attesoro(我编写的)之类的翻译编辑器来让他们保存正确转义的属性文件。

于 2013-03-03T12:10:16.167 回答
1

您可以简单地使用该native2ascii工具,它完全执行此转换(它将所有非 ASCII 字符转换为转义符,但保持现有转义符不变)。

于 2013-03-03T12:09:57.150 回答
0

您的问题是 JavaProperties解码属性文件,假设 ISO-8859-1 编码,并解析转义的 unicode 字符。

所以从某种角度Properties来看,这两个字符串确实是一样的。

我相信如果您需要区分这两者,您将需要编写自己的 parser

它实际上是您默认不需要关心的功能。让我印象最奇怪的一件事是(唯一的)编码是 ISO-8859-1,可能是出于历史原因。

于 2013-03-03T12:20:16.657 回答
0

ICU4J似乎是您正在寻找的。请参阅规范化页面。

于 2013-03-03T12:24:12.343 回答