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

问题描述 投票:4回答:1

我正在使用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)有没有更好的方法来创建charset /编码器?什么不是静态的?我可以从文件中提取它吗?或文件读写器?

java java-8 internationalization utf
1个回答
3
投票

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

但是你可以使用u-escape的其他字符:\u2030,其中应该理解这是UTF-16的表示,存储在单个char(两个字节)中。某些Unicode符号超出了两个字节的限制,并以“代理”对编码。

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

但是显然你也想在代码中写入.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));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.