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]
Найкращі коментарі пропустити