Я искал решение своей проблемы в течение нескольких дней, но не могу получить точный ответ, просматривая ранее отвеченные вопросы / блоги / учебные пособия и т. Д. По всему Интернету.
Моя цель - написать программу, которая принимает десятичное число в качестве входных данных, а затем вычисляет шестнадцатеричное число, а также печатает юникод-символ указанного шестнадцатеричного числа (\uXXXX). Моя проблема в том, что я не могу «преобразовать» шестнадцатеричное число в юникод. (Это должно быть записано в следующем формате: \uXXXX)
Пример:
Вход:
122 (= десятичный)
Выход:
Шестнадцатеричный: 7A
Юникод: z | Символ Юникода: строчная латинская буква "z"
Единственное, что мне удалось сделать, это напечатать юникод (\ u007A), но мне нужен символ («z»). Я подумал, что если в юникоде всего 4 цифры/буквы, мне просто нужно будет «скопировать» шестнадцатеричное число в код и заполнить оставшиеся места нулями, и это вроде как сработает, но, как я уже сказал, мне нужен символ, а не код. Так что я пытался и пытался, но я просто не мог получить символ. Насколько я понимаю, если вам нужен символ, вам нужно напечатать его в виде строки. Но при попытке со строкой я получаю сообщение об ошибке «недопустимый выход из юникода».
Это похоже на то, что вы можете печатать только заранее определенные юникоды, а не «случайные», сгенерированные на месте в зависимости от вашего ввода.
Я только пару дней в 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, условием будет повторять деление до тех пор, пока частное не станет равным нулю. При этом остатки каждого деления будут цифрами/буквами моего шестнадцатеричного числа, поэтому мне нужно их сохранить. Для этого я выбираю целочисленный массив. Остальные (остатки) = hex[j]. Я также бросил переменную в названии «j», чтобы теперь я знал, сколько раз повторяется деление. Так что я мог определить, как долго шестнадцатеричное. В примере это будет 2 буквы/цифры (7A), поэтому j = 2. Затем переменная будет использоваться для определения того, сколько нулей мне нужно, чтобы заполнить юникод. Если у меня есть только 2 буквы/цифры, это означает, что после \u есть 2 пустых места, поэтому мы добавляем два нуля, чтобы получить z вместо \u7A.
Также следующая команда if заменяет любые числа выше 9 символом из массива char выше. В основном так же, как вы бы сделали на бумаге.
Я очень извиняюсь за этот безумно длинный вопрос.
(char) dec
должен подойти, немного более полныйCharacter.toChars(dec)
- person user85421   schedule 15.10.2019