Java Core собеседование: кодировки
Добрый день.
Меня зовут Головач Иван, я занимаюсь интенсивным обучение Java и натаскиванием на собеседования.
В итоге у меня скапливается достаточно большое количество интересного кода по каждому разделу Java Core.
Я бы хотел им поделиться со следующими целями:
1. Возможно, они подтолкнут кого-то к более детальному изучению языка и стандартной библиотеки.
2. Возможно, они помогут кому-то с прохождением/проведением собеседования.
3. Возможно, мне удастся развеять некоторые, по моему мнению неправильные, представления о Java Core, как теме на 1 неделю ограничивающуюся простейшими языковыми конструкциями типа switch/for/if и классами String/ArrayList/InputStream.
Итак — начну:
.
Примеры кода:
Почему строка в которой в два раза больше букв (2 вместо 1) занимает в только 1.5 раза больше места?
public class App {
public static void main(String[] args) throws Exception {
System.out.println("A".getBytes("UTF-16").length);
System.out.println("AA".getBytes("UTF-16").length);
}
}
>> 4
>> 6
.Если UTF-8 так хорош (как все говорят), почему он занимает так много места (и чем он тогда хорош)?
public class App {
public static void main(String[] args) throws Exception {
System.out.println("ЭЮЯ".getBytes("UTF-8").length);
System.out.println("ЭЮЯ".getBytes("latin1").length);
}
}
>> 6
>> 3
-------------------------------------------
UPD:
Использование latin1, как заметил Mike Gorchak приводит к некорректному результату, лучше взять cp1251.
public class App {
public static void main(String[] args) throws Exception {
System.out.println("ЭЮЯ".getBytes("UTF-8").length);
System.out.println("ЭЮЯ".getBytes("cp1251").length);
}
}
>> 6
>> 3
-------------------------------------------.
А что такое этот самый «UTF», если «их» так много?
import java.util.Arrays;
public class App {
public static void main(String[] args) throws Exception {
System.out.println(Arrays.toString("A".getBytes("UTF-8")));
System.out.println(Arrays.toString("A".getBytes("UTF-16")));
System.out.println(Arrays.toString("A".getBytes("UTF-16BE")));
System.out.println(Arrays.toString("A".getBytes("UTF-16LE")));
System.out.println(Arrays.toString("A".getBytes("UTF-32")));
System.out.println(Arrays.toString("A".getBytes("UTF-32BE")));
System.out.println(Arrays.toString("A".getBytes("UTF-32LE")));
}
}
>>
>> [65]
>> [-2, -1, 0, 65]
>> [0, 65]
>> [65, 0]
>> [0, 0, 0, 65]
>> [0, 0, 0, 65]
>> [65, 0, 0, 0]
.Как строка из одного символа может сохраняться в разные размеры байтовых массивов
import java.util.Arrays;
public class App {
public static void main(String[] args) throws Exception {
char ch;
ch = 0x0001;
System.out.println(Arrays.toString(("" + ch).getBytes("UTF-8")));
ch = 0x0111;
System.out.println(Arrays.toString(("" + ch).getBytes("UTF-8")));
ch = 0x1111;
System.out.println(Arrays.toString(("" + ch).getBytes("UTF-8")));
}
}
>> [1]
>> [-60, -111]
>> [-31, -124, -111]
.Все таки в этой строке ОДИН символ или ДВА?
public class App {
public static void main(String[] args) throws Exception {
char ch0 = 55378;
char ch1 = 56816;
String str = new String(new char[]{ch0, ch1});
System.out.println(str);
System.out.println(str.length());
System.out.println(str.codePointCount(0, 2));
System.out.println(str.charAt(0));
System.out.println(str.charAt(1));
}
}
>> 𤧰
>> 2
>> 1
>> ?
>> ?
.
Терминология:
В области терминологии хорошо бы понимать, что значат термины:
character, character set, coded character set, glyph, font, Unicode, codeunit, codepoint, charset, Byte Order Mark (BOM), endianless, Big Endian (BE), Little Endian (LE), variable length encoding, fixed length encoding, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, ASCII, Basic Multilingual Plane (BMP), supplementary characters, surrogate pairs.
.
P.S. Сможет ли кто-то дать наиболее просты и корректные объяснения данных терминов?:)
.
P.P.S. Ближайший набор в группу Java Core — 5 декабря 2013 года.
Ближайший набор в группу Junior Java Developer — февраль 2014.
Больше Вы можете узнать по:
skype: KharkovITCourses
email: [email protected]
Найкращі коментарі пропустити