从十六进制中获取 Unicode
Get the Unicode from a Hexadecimal
几天来我一直在寻找解决我的问题的方法,但在整个互联网上查看以前回答的问题/博客/教程等时无法得到准确的答案。
我的目标是编写一个程序,将十进制数作为输入,然后计算十六进制数,并打印所述十六进制数的 unicode 符号 (\uXXXX)。
我的问题是我不能 "convert" 十六进制数到 unicode。 (必须写成这样的格式:\uXXXX)
示例:
输入:
122(=十进制)
输出:
十六进制:7A
Unicode: \u007A | Unicode 符号:拉丁文小写字母"z"
我唯一能做的就是打印 unicode (\u007A),但我想要符号 ("z")。
我想如果 unicode 只有 4 numbers/letters,我只需要 "copy" 十六进制到代码中并用 0 填充剩余的位置并且它有点工作,但正如我所说我需要符号不是代码。所以我试了又试,但就是找不到符号。
据我了解,如果您想要符号,则需要将其打印为字符串。
但是当用字符串尝试时,我得到错误 "illegal unicode escape".
就好像你只能打印预先确定的 unicode 而不是 "random" 根据你的输入当场生成的 unicode。
我才进入 Java 几天,如有遗漏,请见谅。
感谢您的阅读。
我的代码:
int dec;
int quotient;
int rest;
int[]hex = new int[10];
char[]chars = new char[]{
'F',
'E',
'D',
'C',
'B',
'A'
};
String unicode;
// Input Number
System.out.println("Input decimal number:");
Scanner input = new Scanner(System.in);
dec = input.nextInt();
//
// "Converting to hexadecimal
quotient = dec / 16;
rest = dec % 16;
hex[0] = rest;
int j = 1;
while (quotient != 0) {
rest = quotient % 16;
quotient = quotient / 16;
hex[j] = rest;
j++;
}
//
/*if (j == 1) {
unicode = '\u000';
}
if (j == 2) {
unicode = '\u00';
}
if (j == 3) {
unicode = '\u0';
}*/
System.out.println("Your number: " + dec);
System.out.print("The corresponding Hexadecimal number: ");
for (int i = j - 1; i >= 0; i--) {
if (hex[i] > 9) {
if (j == 1) {
unicode = "\u000" + String.valueOf(chars[16 - hex[i] - 1]);
}
if (j == 2) {
unicode = "\u00" + String.valueOf(chars[16 - hex[i] - 1]);
}
if (j == 3) {
unicode = "\u0" + String.valueOf(chars[16 - hex[i] - 1]);
}
System.out.print(chars[16 - hex[i] - 1]);
} else {
if (j == 1) {
unicode = "\u000" + Character.valueOf[hex[i]);
}
if (j == 2) {
unicode = "\u00" + Character.valueOf(hex[i]);
}
if (j == 3) {
unicode = "\u0" + Character.valueOf(hex[i]);
}
System.out.print(hex[i]);
}
}
System.out.println();
System.out.print("Unicode: " + (unicode));
}
这根本不是高级代码,我写的完全是我在纸上计算的方式。
将数字除以 16 直到我得到 0,这样做时剩下的是十六进制等价物。
所以我把它放在一个 while 循环中,因为我会将数字除以 n 次直到得到 0,条件是重复除法直到商等于零。
在这样做的同时,每个部门的剩余部分将是我的十六进制数的 numbers/letters,所以我需要保存它们。我选择一个整数数组来这样做。其余(剩余)= hex[j]。
我还在所谓的 "j" 中添加了一个变量,所以我现在知道除法重复了多少次。所以我可以确定十六进制有多长。
在这个例子中,它将是 2 letters/numbers 长 (7A),所以 j = 2。
然后该变量将用于确定我需要用多少个 0 来填充 unicode。
如果我只有 2 letters/numbers,这意味着在 \u 之后有 2 个空位,所以我们添加两个零,得到 \u007A 而不是 \u7A。
另外,下一个 if 命令将任何大于 9 的数字替换为上述 char 数组中的一个字符。基本上就像你在纸上做的那样。
对于这个异常冗长的问题,我感到非常抱歉。
U+007A 是 3 字节 int 代码指针.
\u007A
是 UTF-16 字符。
一个Unicode码指针,符号,有时转换成两个char
然后十六进制数不一致。因此最好使用代码指针。由于 UTF-16 只是一种用于双字节表示的编码方案,其中 3 字节 Unicode 数字的代理项对不包含 /
等(高位始终为 1)。
int hex = 0x7A;
hex = Integer.parseUnsignedInt("007A", 16);
char ch = (char) hex;
String stringWith1CodePoint = new String(new int[] { hex }, 0, 1);
int[] codePoints = stringWith1CodePoint.codePoints().toArray();
String s = ""; // U+1D11E = "\uD834\uDD1E"
您可以简单地使用 System.out.printf
or String.format
来做您想做的事情。
示例:
int decimal = 122;
System.out.printf("Hexadecimal: %X\n", decimal);
System.out.printf("Unicode: u%04X\n", decimal);
System.out.printf("Latin small letter: %c\n", (char)decimal);
输出:
Hexadecimal: 7A
Unicode: u007A
Latin small letter: z
几天来我一直在寻找解决我的问题的方法,但在整个互联网上查看以前回答的问题/博客/教程等时无法得到准确的答案。
我的目标是编写一个程序,将十进制数作为输入,然后计算十六进制数,并打印所述十六进制数的 unicode 符号 (\uXXXX)。 我的问题是我不能 "convert" 十六进制数到 unicode。 (必须写成这样的格式:\uXXXX)
示例:
输入:
122(=十进制)
输出:
十六进制:7A
Unicode: \u007A | Unicode 符号:拉丁文小写字母"z"
我唯一能做的就是打印 unicode (\u007A),但我想要符号 ("z")。 我想如果 unicode 只有 4 numbers/letters,我只需要 "copy" 十六进制到代码中并用 0 填充剩余的位置并且它有点工作,但正如我所说我需要符号不是代码。所以我试了又试,但就是找不到符号。 据我了解,如果您想要符号,则需要将其打印为字符串。 但是当用字符串尝试时,我得到错误 "illegal unicode escape".
就好像你只能打印预先确定的 unicode 而不是 "random" 根据你的输入当场生成的 unicode。
我才进入 Java 几天,如有遗漏,请见谅。
感谢您的阅读。
我的代码:
int dec;
int quotient;
int rest;
int[]hex = new int[10];
char[]chars = new char[]{
'F',
'E',
'D',
'C',
'B',
'A'
};
String unicode;
// Input Number
System.out.println("Input decimal number:");
Scanner input = new Scanner(System.in);
dec = input.nextInt();
//
// "Converting to hexadecimal
quotient = dec / 16;
rest = dec % 16;
hex[0] = rest;
int j = 1;
while (quotient != 0) {
rest = quotient % 16;
quotient = quotient / 16;
hex[j] = rest;
j++;
}
//
/*if (j == 1) {
unicode = '\u000';
}
if (j == 2) {
unicode = '\u00';
}
if (j == 3) {
unicode = '\u0';
}*/
System.out.println("Your number: " + dec);
System.out.print("The corresponding Hexadecimal number: ");
for (int i = j - 1; i >= 0; i--) {
if (hex[i] > 9) {
if (j == 1) {
unicode = "\u000" + String.valueOf(chars[16 - hex[i] - 1]);
}
if (j == 2) {
unicode = "\u00" + String.valueOf(chars[16 - hex[i] - 1]);
}
if (j == 3) {
unicode = "\u0" + String.valueOf(chars[16 - hex[i] - 1]);
}
System.out.print(chars[16 - hex[i] - 1]);
} else {
if (j == 1) {
unicode = "\u000" + Character.valueOf[hex[i]);
}
if (j == 2) {
unicode = "\u00" + Character.valueOf(hex[i]);
}
if (j == 3) {
unicode = "\u0" + Character.valueOf(hex[i]);
}
System.out.print(hex[i]);
}
}
System.out.println();
System.out.print("Unicode: " + (unicode));
}
这根本不是高级代码,我写的完全是我在纸上计算的方式。 将数字除以 16 直到我得到 0,这样做时剩下的是十六进制等价物。 所以我把它放在一个 while 循环中,因为我会将数字除以 n 次直到得到 0,条件是重复除法直到商等于零。 在这样做的同时,每个部门的剩余部分将是我的十六进制数的 numbers/letters,所以我需要保存它们。我选择一个整数数组来这样做。其余(剩余)= hex[j]。 我还在所谓的 "j" 中添加了一个变量,所以我现在知道除法重复了多少次。所以我可以确定十六进制有多长。 在这个例子中,它将是 2 letters/numbers 长 (7A),所以 j = 2。 然后该变量将用于确定我需要用多少个 0 来填充 unicode。 如果我只有 2 letters/numbers,这意味着在 \u 之后有 2 个空位,所以我们添加两个零,得到 \u007A 而不是 \u7A。
另外,下一个 if 命令将任何大于 9 的数字替换为上述 char 数组中的一个字符。基本上就像你在纸上做的那样。
对于这个异常冗长的问题,我感到非常抱歉。
U+007A 是 3 字节 int 代码指针.
\u007A
是 UTF-16 字符。
一个Unicode码指针,符号,有时转换成两个char
然后十六进制数不一致。因此最好使用代码指针。由于 UTF-16 只是一种用于双字节表示的编码方案,其中 3 字节 Unicode 数字的代理项对不包含 /
等(高位始终为 1)。
int hex = 0x7A;
hex = Integer.parseUnsignedInt("007A", 16);
char ch = (char) hex;
String stringWith1CodePoint = new String(new int[] { hex }, 0, 1);
int[] codePoints = stringWith1CodePoint.codePoints().toArray();
String s = ""; // U+1D11E = "\uD834\uDD1E"
您可以简单地使用 System.out.printf
or String.format
来做您想做的事情。
示例:
int decimal = 122;
System.out.printf("Hexadecimal: %X\n", decimal);
System.out.printf("Unicode: u%04X\n", decimal);
System.out.printf("Latin small letter: %c\n", (char)decimal);
输出:
Hexadecimal: 7A
Unicode: u007A
Latin small letter: z