Java 使用位操作将Unicode转换为字符

Java 使用位操作将Unicode转换为字符,java,javascript,unicode,character,bit-manipulation,Java,Javascript,Unicode,Character,Bit Manipulation,多亏了这个问题,我知道如何将Unicode转换为字符,但当我在Unicode上执行按位操作时,这种转换并不太好 .fromCharCode()是一个Javascript函数,用于将Unicode转换为字符。我想知道它在Java中的等价物,能够作为参数处理按位操作 此代码不会编译 public String str2rstr_utf8(String input) { String output = ""; int i = -1; int x, y; while (++i <

多亏了这个问题,我知道如何将Unicode转换为字符,但当我在Unicode上执行按位操作时,这种转换并不太好

.fromCharCode()
是一个Javascript函数,用于将Unicode转换为字符。我想知道它在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;
}
公共字符串str2rstr\u utf8(字符串输入){
字符串输出=”;
int i=-1;
int x,y;
而(++i6)和0x3F),则0x80(x和0x3F);
如果(x>>18)和0x07)、0x80 |(x>>12)和0x3F)、0x80 |(x>>6)和0x3F)、0x80 |(x和0x3F));
}
返回输出;
}

如果我没弄错的话,您正在尝试用UTF-8编码Java字符串。Java提供了对它的直接支持:

public byte[] str2rstr_utf8(String str)
{
    return str.getBytes(Charset.forName("UTF-8"));
}

实际上,您正在将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();
}
公共字符串str2rstr\u utf8(字符串输入)
{
byte[]utf8=input.getBytes(Charset.forName(“UTF-8”);
StringBuilder输出=新的StringBuilder(utf8.length);
对于(int i=0;i
“Unicode”?您是指UTF-16LE吗?
字符。codePointAt
已返回补充代码点(从索引和索引+1处的代理项对派生)。你不需要自己计算。事实上,既然你这么做了,你可能会得到错误的结果。@Codo我相信这个条件永远不会被触发。@syb0rg:我不明白你的评论与我的答案有什么关系。如果你看我的答案,你会发现它包含整数参数。这是因为传递给
String.fromCharCode()
的任何内容都是整数,而不是字符串。@syb0rg:如果你看我的答案,你会发现它是
str2rstr\u utf8
的实现,而不是
String.fromCharCode
。它摆脱了函数中进行的所有逐位操作。不是API,它是用于加密的。什么样的加密要求您在UTF-16编码字符串中存储UTF-8编码字节?Unicode很难与加密一起使用。现在,您正在为混合添加一个额外的不必要的复杂性。只需返回新字符串(input.getBytes(Charset.forName(“UTF-8”),“ISO-8859-1”)即可。在Javascript中,这是正常的,许多API将字符串视为二进制字符串,而语言中没有字节数组。