我用java 8和国际化的工作。从我的理解,.properties文件(及随后的国际化代码)asumes这些文件是在“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)是否有创建字符集/编码器的更好的办法?东西是不是静态的?我可以从文件中提取呢?或一个文件读/写?
作为一个历史的反常现象,是的.properties在ISO-8859-1,以便您可以使用StandardCharsets.ISO_8859_1
(如果不是在Android)。
然而,你可能使用其它字符的u转义:\u2030
其中一个应该明白,这是UTF-16的表示存储在一个单一的char
(两个字节)。某些Unicode符号超过两个字节的限制,并且在一个“代理”对进行编码。
PropertyResourceBundle
,每次\uXXXX
将自动解码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));
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句