Java字符串Unicode值
某些unicode字符跨两个Java字符。从http://docs.oracle.com/javase/tutorial/i18n/text/unicode.html引用:
与是16位的范围之外,并从0x10000的到在0x10FFFF的范围内的值的字符,被称为补充字符,并且被定义为一对char值。
逃避非ASCII正确的方法:
private static String escapeNonAscii(String str) {
StringBuilder retStr = new StringBuilder();
for(int i=0; i<str.length(); i++) {
int cp = Character.codePointAt(str, i);
int charCount = Character.charCount(cp);
if (charCount > 1) {
i += charCount - 1; // 2.
if (i >= str.length()) {
throw new IllegalArgumentException("truncated unexpectedly");
}
}
if (cp < 128) {
retStr.appendCodePoint(cp);
} else {
retStr.append(String.format("\\u%x", cp));
}
}
return retStr.toString();
}
不错!很酷的例子 – user489041 2013-02-11 23:15:09
此方法转换任意String
成ASCII安全表示在Java源代码中使用(或属性文件,例如):
public String escapeUnicode(String input) {
StringBuilder b = new StringBuilder(input.length());
Formatter f = new Formatter(b);
for (char c : input.toCharArray()) {
if (c < 128) {
b.append(c);
} else {
f.format("\\u%04x", (int) c);
}
}
return b.toString();
}
真棒,完美工作。谢谢 – user489041 2011-04-20 18:08:07
@ user489041:我不同意:正确的做法是用'java -encoding UTF-8'编译。没有混乱,没有大惊小怪。特别是因为20年来,Java仍然没有标准的方式来用他们的正式名称来谈论代码点。这意味着你正试图在你的代码中插入邪恶和神秘的魔法数字。这不是一件好事!当然,我可能更愿意看到“\ N {希腊小写字母ALPHA}”而不是“α”,但是I ** SURELY **不想看到“\ u03B1”!这只是邪恶的。你将如何保持这种crudola? – tchrist 2011-04-23 22:40:33
只有4位数? Unicode是一个32位字符集,OP讲日语。 – Martin 2012-08-28 11:17:33
为什么?你想要做什么? 'charAt()'会有所帮助。如果你想要Unicode代码而不是UTF-16代码单元,那么'codePointAt()'是更正确的方法(但是如果你想为Java源代码或类似代码编写'\ u'转义则不会有帮助。 – 2011-04-20 17:01:03
为了简化一切,我有一个来自java源文件的英文字符串。它被转换成日语。然后我需要\ uXXXX unicode值,因为在源文件中英文字符串将被日文替换。 – user489041 2011-04-20 17:05:27
@user:在这种情况下,通过'charAt()'将值返回格式化为4位数的十六进制数,并且应该预先设置'\ u'。 – 2011-04-20 17:07:28