我知道如何通过this问题将Unicode转换为字符,但是当我对Unicode执行按位操作时,这种方法效果不佳。
.fromCharCode()
是一个将Unicode转换为字符的Javascript函数。我想知道它在Java中的等价物,能够将按位操作作为参数处理。
此代码无法编译
public String str2rstr_utf8(String input) {
String output = "";
int i = -1;
int x, y;
while (++i < input.length()) {
/* Decode utf-16 surrogate pairs */
x = Character.codePointAt(input, i);
y = i + 1 < input.length() ? Character.codePointAt(input, i + 1) : 0;
if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
i++;
}
/* Encode output as utf-8 */
if (x <= 0x7F) output += String.fromCharCode(x);
else if (x <= 0x7FF) output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), 0x80 | (x & 0x3F));
else if (x <= 0xFFFF) output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F));
else if (x <= 0x1FFFFF) output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), 0x80 | ((x >>> 12) & 0x3F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F));
}
return output;
}
答案 0 :(得分:2)
如果我没弄错的话,你试图用UTF-8编码一个Java字符串。在Java中直接支持它:
public byte[] str2rstr_utf8(String str)
{
return str.getBytes(Charset.forName("UTF-8"));
}
答案 1 :(得分:0)
您实际上在做的是将UTF-16编码的输入字符串转换为UTF-16编码的输出字符串,其字符包含UTF-8编码字节的值。你几乎不需要在Unicode编程中这样做!但实际上你需要的机会很少(比如需要与需要这种奇怪格式的字符串的第三方API交互),那么你可以通过不手动处理按位操作来完成同样的事情,让Java做为你工作:
public String str2rstr_utf8(String input)
{
byte[] utf8 = input.getBytes(Charset.forName("UTF-8"));
StringBuilder output = new StringBuilder(utf8.length);
for (int i = 0; i < utf8.length; ++i)
output.append((char)utf8[i]);
return output.toString();
}