我有一个属性文件,可能/可能不包含其键值中的unicode转义字符。请参阅下面的示例。我的工作是确保如果属性文件中的值包含非ascii字符,那么它应该是unicode转义。因此,在下面的示例中,第一个条目是OK,所有条目(如第二个条目)都应该被删除并转换为第一个条目。
##sample.properties
escaped=cari\u00F1o
nonescaped=cariño
normal=darling
基本上我的问题是如何在 cari \ u00F1o 和cariño之间区分Java,因为就Java而言,它将它们视为相同。
答案 0 :(得分:2)
Java 中的属性文件必须保存在Java的ISO-8859-1字符集中才能正确读取它们。这意味着可以使用西欧语言中的特殊字符而无需转义它们。如果不逃避复活节欧洲,俄罗斯或中国的其他语言,则无法使用其他语言。
因此,只有少数非ascii字符可以出现在属性文件中而不进行转义。
要检测字符是否已转义,您需要直接打开属性文件,而不是通过Properties类。当您通过它加载文件时,Properties类会为您执行所有取消操作。您应该使用File类或通过System.getResourceAsStream作为InputStream打开它们。一旦这样做,您可以一次扫描一个字节的输入流,并确保所有字节都在0x20-0x7E范围内加上新行\ r和\ n,这是您在属性中所期望的ASCII range of characters文件。
我建议您的翻译人员不要尝试直接编写属性文件。他们应该为您提供转换为属性文件的电子表格等文档。或者他们可以使用translation editor such as Attesoro(我写的)让他们保存正确转义的属性文件。
答案 1 :(得分:1)
你可以简单地使用native2ascii
工具,它完全执行这种转换(它会将所有非ASCII字符转换为转义但保留现有的转义完整)。
答案 2 :(得分:0)
您的问题是Java Properties
类解码属性文件,假设采用ISO-8859-1编码,解析转义unicode字符。
所以从Properties
的角度来看,这两个字符串确实是相同的。
我相信如果您需要区分这两者,您将需要编写自己的解析器。
这实际上是一种你不需要在默认情况下照顾的特性。令我印象最奇怪的是,(唯一的)编码是ISO-8859-1,可能是出于历史原因。
答案 3 :(得分:0)
图书馆ICU4J似乎正是您所寻找的。请参阅Normalization页面。