将unicode字符转换为包含u + [hexa]表示形式的字符串(“ \ u2030”)

时间:2019-03-11 08:25:49

标签: java java-8 internationalization utf

我正在使用Java 8和I18N。根据我的理解,.properties文件(及其后的I18N代码)假定这些文件采用“ ISO-8859-1”文件格式。因此,我遇到了无法以该文件格式表示的字符的麻烦。

从文件编写器更改为OutputStreamWriter将无济于事,因为代码的另一端仍然无法读取这些字符。

我确实提出了一个可行的解决方案,但这非常不雅致。

StringBuilder utfRepresentation = new StringBuilder();
for (int index = 0; index < input.length(); index++) {
    if (!Charset.forName("ISO-8859-1").newEncoder().canEncode(input.charAt(index))) {
        utfRepresentation.append("\\u");
        utfRepresentation.append(Integer.toHexString(input.codePointAt(index)));
    } else {
        utfRepresentation.append(input.charAt(index));
    }
}

现在,我确实需要做其他事情,例如提取编码器,而不是每次都制作一个新的编码器,但是我的问题完全是另外一回事:

1)是否有更干净的方法将转换为\u2030
2)这甚至是U + 2030? UTF-8 / 16?
3)有没有更好的方法来创建该字符集/编码器?是不是一成不变的?我可以从文件中提取出来吗?或文件读取器/写入器?

1 个答案:

答案 0 :(得分:3)

作为历史异常,.properties位于ISO-8859-1中,您可以使用StandardCharsets.ISO_8859_1(如果不是在Android上)。

不过,对于其他字符,可以使用u转义:\u2030,在此应理解这是UTF-16的表示形式,存储在单个char(两个字节)中。  某些Unicode符号超出了两个字节的限制,并以“代理”对进行编码。

  • PropertyResourceBundle读取时,每个\uXXXX都会被自动解码
  • 您可以通过构建将UTF-8模板文件转换为u-escaped .properties;例如在Maven中。
  • 有时ListResourceBundle是更合适的选择。它在Java中有一个数组,对于国际项目,所有Java源都可以设置为UTF-8。它的行为不同:所有字符串都立即加载。

但是显然您还想在代码中 write 到.properties。因此不在课程路径上。

这里似乎是最好的属性

为此,Properties类是理想的。它具有属性的XML变体(而不是键值行),默认情况下使用UTF-8。但是传统的.properties也可以用其他(UTF-8)编码进行读写。


StringBuilder utfRepresentation = new StringBuilder();
for (int index = 0; index < input.length(); index++) {
    char ch = input.charAt(index);
    if (ch < 128) {
        utfRepresentation.append(ch);
    } else {
        utfRepresentation.append(String.format("\\u%04X", ch));
    }
}