超过4个十六进制数字的Java unicode转义


Ant<propertyfile>任务生成的Java属性文件包含匈牙利字母ő的unicode转义u000151

我预计u0151,它是Ant中的一个bug吗?(Ant 1.8.0,Java 1.7.0)

(基于JLS,只有4位unicode转义被认为是有效的…)

开始阅读Unicode序列的好地方是类Character的Javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html.我不能确定这是否是一个bug,但它看起来像一个bug。此外,您可能可以使用一个实用程序将任何文本转换为unicode序列,反之亦然。在本文中,您可以找到一个链接到一个具有这种实用性的开源库。查找文章"字符串Unicode转换器"中的段落

尽管我没有发现与该问题相关的错误报告,但根据Oracle官方文档:Java平台中的补充字符,这可能是一个错误

本文档指出,一个补充字符可以由两个unicode escapes:表示

对于使用的字符编码不能表示Java编程语言直接提供Unicode转义语法。此语法尚未经过增强以表示直接补充字符。相反,它们由中两个代码单元的两个连续Unicode转义字符的UTF-16表示。例如,角色U+20000被写成"\uD840\uDC00"。

本文档还指定了一种语法,用于表示文本输入unicode escape语法(即Java在语言级别不支持它):

对于文本输入,Java 2 SDK提供了一种代码点输入方法它接受形式为"\Uxxxxxx"的字符串,其中大写字母"U"指示转义序列包含六个十六进制数字,从而允许补充字符。小写"u"表示转义序列的原始形式"\uxxxx"。

这意味着Ant<propertyfile>任务不正确,它应该生成u0151U000151而不是u000151(注意大写/小写U)-至少基于上面的文档。

但在实践中,\Uxxxxxx语法似乎不受支持:

【测试属性】

key1=u0151
key2=u000151
key3=U000151

[PropertiesParserTest.java]

import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import org.junit.Test;
public class PropertiesParserTest {
@Test
public void testLoad() throws IOException {
try (InputStream input = getClass().getResourceAsStream("test.properties")) {
Properties p = new Properties();
p.load(input);
// Valid unicode escape
assertEquals("ő", p.getProperty("key1"));
// The 6-digit unicode escape generated by Ant is incorrect
assertEquals("u0001" + "51", p.getProperty("key2"));
// Uxxxxxx is not supported
assertEquals("U000151", p.getProperty("key3"));
}
}
@Test
public void testGenerate() throws IOException {
Properties p1 = new Properties();
p1.setProperty("key1", "ő");
p1.setProperty("key2", "u000151");
// Not supported in practice: p.setProperty("key3", "U000151");
File file = File.createTempFile("PropertiesParserTest_", ".properties");
System.out.println(file);
try (OutputStream output = new FileOutputStream(file)) {
p1.store(output, null);
}
try (InputStream input = new FileInputStream(file)) {
Properties p2 = new Properties();
p2.load(input);
// Valid unicode escape
assertEquals("ő", p2.getProperty("key1"));
// The 6-digit unicode escape generated by Ant is incorrect
assertEquals("u0001" + "51", p2.getProperty("key2"));
}
}
}

最新更新