В задаче нужно написать метод для перевода строки в двоичный код и получения номера каждого символа этой строки в таблице Юникод.
Почему для получения номера символа в таблице Юникод используется та же переменная (int number), что и является параметром метода toBinary() ?
public class Solution {
public static void main(String[] args) {
String string = "JavaRush";
char[] charArray = string.toCharArray();
for (int i = 0; i < charArray.length; i++) {
print(charArray[i]);
}
}
private static void print(int number) {
String result = String.format("Номер символа %s в таблице
Unicode - %d,а в двоичной системе - %s", (char) number, number, toBinary(number));
System.out.println(result);
}
public static String toBinary(int number) {
String result = Integer.toBinaryString((char)number);
return result;
}
}
Никита
11 уровень
Номер символа в Юникод
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас ПасинковSoftware Developer в ZipyMaster
15 октября 2022, 18:05
то, что в разных методах переменные названы одинаково - это не значит, что они одинаковые.
это реально разные переменные из разных методов. просто называются одинаково, но не более)
0
Никита
15 октября 2022, 23:30
Я понимаю, что означает локальная переменная "int number" метода print(), но что такое переменная "number" в String.format()?
0
Стас ПасинковSoftware Developer в ZipyMaster
16 октября 2022, 11:23
а как вы понимаете как работает String.format()?
0
Никита
17 октября 2022, 18:20
Как Я понимаю, String.format объединяет строку с данными - пишешь строку, затем переменные, которые должны в этой строке быть.
В данном случае у нас есть переменная-параметр int number и непонятная мне переменная int number внутри String.format. При этом нигде в коде больше int number нет.
0
Стас ПасинковSoftware Developer в ZipyMaster
17 октября 2022, 18:50полезный
в String.format() вы сначала передаете строку
в которой там, где надо будет что-то заменить - заполнено всякими %s для строкового представления или %d для численного.
а потом, после этой строки - вы передаете туда то, на что надо будет заменить вот эти вот штуки.
в вашей строке там указано что-то типа: текст %s текст %d текст %s
соответственно, вы потом и передаете 3 каких-то значения, которые заменят вот эти вот штуки из начальной строки.
в первом случае вы передали (char) number. то-есть тут будет какой-то символ из таблицы символов, который имеет номер в этой таблице соответствующий тому, что хранится в переменной number. это будет в виде строки (строка из одного символа)
потом у нас идет %d, и вторым значением мы передаем сам номер (переменная number сама по себе, а не соответствующий ей символ из таблицы символов)
ну и третьим у нас снова %s, который заменится на то, что вернет нам метод toBinary() когда мы передадим в него number
если все-равно что-то не понятно - напишите что именно :)
+3
Никита
17 октября 2022, 20:06
Спасибо, вопросов много:))
1) Почему в методах print() и toBinary() тип параметра int? Ведьв main() мы применяем print() к элементу массива чаров?
2) Почему в String.format() символу соответствует параметр %s, хотя к символу относится переменная (char) number, тип которой char, полученный из int?
3) Почему переменная number внутри String.format() обозначает номер символа в Юникод, хотя нигде в коде такой логики напрямую нет.
0
Стас ПасинковSoftware Developer в ZipyMaster
17 октября 2022, 21:15полезный
1. потому что char - это числовой тип данных. это число, которое обозначает номер какого-то конкретного символа в таблице символов (юникод, или в других таблицах символов).
чар "меньше" инта, потому что он от 0 и до 65535 включительно. а инт - от минус двух миллиардов до плюс двух миллиардов. с хвостиком.
поэтому в бОльший инт мы смело можем засунуть меньший чар
2. потому что мы хотим вывести на экран символ. в String.format() вроде нет специального плейсхолдера для одного символа. но есть плейсхолдер для строки. вот им мы и пользуемся. просто у нас строка состоит из одного символа
3. потому что в джаве по умолчанию все строки в кодировке юникода. об этом написано в ссылочке выше, что чар - это UTF-16 символ, если вам так удобнее понять будет. (хотя, как мы уже выяснили, чар - это просто число, номер какого-то символа в этой таблице символов)
+2
Стас ПасинковSoftware Developer в ZipyMaster
17 октября 2022, 21:52
вот таблица юникод символов.
наводите мышкой на любой символ и видите его "порядковый номер" в этой таблице. сначала в шестнадцетиричном виде, а потом указан его номер в привычном нам десятичном виде.
так вот то число из number - это номер какого-то символа из этой таблицы
0
Никита
18 октября 2022, 16:47
Является ли ошибкой в правильном решении то, что мы получаем номер символа именно из таблицы Юникод? Ведь по факту мы
выводим номер из ASCII. На скриншоте буква 'J' из Юникод.
0
Стас ПасинковSoftware Developer в ZipyMaster
18 октября 2022, 19:10полезный
For backward compatibility, the first 128 Unicode characters point to ASCII characters. And since UTF-8 encodes each of those characters using 1-byte.
ASCII is essentially just UTF-8, or we can say that ASCII is a subset of Unicode. Vice versa isn’t true.
отсюда
если в двух словах, то первая часть юникода совпадает с ASCII. ну это там где цифры, латинские символы и все такое)
+1
Никита
19 октября 2022, 12:06решение
Спасибо! Вы помогли мне "добить" эту задачу) Ниже напишу то, что усвоил (вдруг кому-нибудь пригодится).
Указывая параметром print() переменную int number, мы тем самым неявно переводим char в int (можно оставить char, тогда дальнейший код придётся немного изменить).
В String.format() для "символа" спецификатором выступает %s (хотя можно и %с), так как он применим к любому типу, который будет приведён к строке. Этому спецификатору соответствует (char)number - таким образом переводим параметр int number в char, тем самым получая номер символа в Unicode.
+3