gpt4 book ai didi

java - 从十六进制获取 Unicode

转载 作者:行者123 更新时间:2023-12-02 09:25:06 24 4
gpt4 key购买 nike

我几天来一直在寻找问题的解决方案,但在互联网上查看以前回答过的问题/博客/教程等时却找不到准确的答案。

我的目标是编写一个程序,它以十进制数作为输入,然后计算十六进制数,并打印所述十六进制数的unicode符号(\uXXXX)。我的问题是我无法将十六进制数“转换”为 unicode。 (必须以这种格式编写:\uXXXX)

示例:

输入:

122(= 十进制)

输出:

十六进制:7A

Unicode:\u007A | Unicode 符号:拉丁小写字母“z”

我唯一能做的就是打印 unicode (\u007A),但我想要符号 (“z”)。我想如果 unicode 只有 4 个数字/字母,我只需要将十六进制“复制”到代码中,并用 0 填充剩余的位置,这样就可以了,但正如我所说,我需要符号而不是代码。所以我试了又试,但就是找不到这个符号。据我了解,如果您想要该符号,则需要将其打印为字符串。但是当尝试使用字符串时,我收到错误“非法 unicode 转义”。

这就像您只能打印预先确定的 unicode,而不能打印与您的输入相关的现场生成的“随机”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,所以条件是重复除法直到商等于 0。这样做时,每个部分的剩余部分将是我的十六进制数字的数字/字母,所以我需要保存它们。我选择一个整数数组来执行此操作。剩余(剩余)= hex[j]。我还在“j”中添加了一个变量,这样我现在就可以知道除法重复了多少次。这样我就可以确定十六进制有多长。在本例中,它有 2 个字母/数字长 (7A),因此 j = 2。然后,该变量将用于确定需要用多少个 0 来填充 unicode。如果我只有 2 个字母/数字,则意味着\u 后面有 2 个空格,因此我们添加两个零,得到\u007A 而不是\u7A。

此外,下一个 if 命令将使用上面 char 数组中的字符替换任何大于 9 的数字。基本上就像在纸上做的一样。

我对这个超长的问题感到非常抱歉。

最佳答案

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"

关于java - 从十六进制获取 Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58397923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com