【问题标题】:Get the Unicode from a Hexadecimal从十六进制获取 Unicode
【发布时间】:2020-02-12 07:50:15
【问题描述】:

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

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

例子:

输入:

122(= 十进制)

输出:

十六进制:7A

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

我唯一能做的就是打印 unicode (\u007A),但我想要符号 ("z")。 我想如果 unicode 只有 4 个数字/字母,我只需要将十六进制“复制”到代码中,并用 0 填充剩余的位置,这有点工作,但正如我所说,我需要符号而不是代码。所以我试了又试,但我就是无法得到这个符号。 据我了解,如果您想要该符号,则需要将其打印为字符串。 但是当用字符串尝试它时,我得到错误“非法 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。 这样做时,每个部门的剩余部分将是我的十六进制数字的数字/字母,所以我需要保存它们。我选择一个整数数组来这样做。休息(剩余)=十六进制[j]。 我还在名为“j”的变量中添加了一个变量,所以我现在要知道除法重复了多少次。所以我可以确定十六进制有多长。 在示例中,它将 2 个字母/数字长 (7A),因此 j = 2。 然后,该变量将用于确定我需要用多少个 0 来填充 unicode。 如果我只有 2 个字母/数字,这意味着 \u 后面有 2 个空位,所以我们添加两个零,得到 \u007A 而不是 \u7A。

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

对于这个冗长的问题,我深表歉意。

【问题讨论】:

  • 添加您尝试过的代码可能会帮助别人回答您​​的问题并查明您的问题所在。
  • (char) dec 应该可以,更完整一点Character.toChars(dec)
  • 注意:你不能打印所有的 unicode 代码点:有些只是组合字符,在这种情况下你应该添加一个占位符(你经常会发现虚线圆圈),其他特殊字符:只打印名称。 (并寻找韩文代码点)

标签: java unicode hex unicode-escapes unicode-literals


【解决方案1】:

U+007A 是 3 个字节的 int 代码指针

\u007A 是 UTF-16 字符。

Unicode 代码指针、符号有时会转换为两个chars,然后十六进制数字不一致。因此最好使用代码指针。由于 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"

【讨论】:

  • 非常感谢您的快速回答。还要感谢您为我清理事情,恐怕我目前对这个主题的了解让我很难完全理解这一点。我会调查一下,谢谢。
【解决方案2】:

您可以简单地使用System.out.printfString.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

【讨论】:

  • 非常感谢,这可以为我节省很多时间。不幸的是,我以前没有那么聪明,我会研究你的答案以完全理解每个命令的作用。再次感谢您对初学者友好的回答。
  • 所以我查看了Formatter (Oracle Docs) 上的 Formatter (?) 博客,据我了解:printf = 格式化您的输出 | % 用于添加转换 | %X 将输出格式化为十六进制 | %c 将输出格式化为 unicode 字符。我唯一不明白的是 u%04X 或更多它是如何工作的。我想“u”像往常一样打印,但 04 到底是做什么的?我在上述网站上找不到这个“04”。 @克里斯托斯
  • 这是零填充格式。 u 只是您要在填充字符串之前打印的字符,04 表示用4 零填充的零。您可以搜索printf 零填充以获取更多详细信息,例如这里java2s.com/Tutorial/Java/0120__Development/…
猜你喜欢
  • 2016-09-04
  • 2015-08-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2019-04-13
  • 2013-12-02
相关资源
最近更新 更多