我有一个十进制的字符unicode值(大写A是65)。
当值越高时,例如120016是数学A,我必须根据它的十进制值检索字符。
为实现这一目标,我使用了
char c = (char)key;
我遇到一种非常奇怪的行为:忽略第一个十六进制数字。
以下是NetBeans的屏幕截图。
以下是我要打印的字符的unicode值
以十六进制转换的<1200> 120016是1D4D0。 但是,当它被上面的代码转换时,它将转换为\ uD4D0,如您所见,忽略第一个十六进制数字。我完全不知道为什么会这样。 这两个语句之间没有指令,键值仅作为参数给出,因此在以十六进制转换时不能更改。
答案 0 :(得分:1)
正如ThorbjørnRavnAndersen所解释的那样,将一个int转换为一个字符会静默地丢弃一个超过char类型限制的int(4个字节)消耗的字节(2个字节)。
要绕过此限制,请不要转换为char而是转换为String
您可以使用Integer.toHexString(int)
方法
返回整数参数的字符串表示形式,作为基数为16的无符号整数。
int x = 120016;
String string = Integer.toHexString(x);
答案 1 :(得分:1)
数学A是120016 在utf-8中 Java使用 utf-16 ,所以这就是为什么你会看到不同的值 - 它是不同的编码
答案 2 :(得分:0)
a int
花费32位,char
花费16位,十六位数花费4位。
将int
强制转换为char
时,溢出的位将被截断。例如:
int key = 0b00000000000000011101010011010000;//120016
^---------------
char c = 0b1101010011010000;// (c = (char)key) == 0xD4D0