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]

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn

Найкращі коментарі пропустити

Мне, честно говоря непонятно, почему тут все так на Головача накинулись?
Напишу свой скромный взгляд со стороны обучающегося (вернее самообучающегося).
Некоторое время назад совершенно случайно здесь же набрел на ссылку на его курсы, открыл первую попавшуюся видеозапись лекции (попалась по JUnit and Hamcrest ) и на следующий же день побежал заказывать и покупать в Розетке 2TB винчестер, чтобы пока его записи лекций выложенные им на youtube не начали исчезать их все успеть себе сохранить по курсам Core, Junior и Аддоны.
На сегодняшний момент самостоятельно, переписывая код с видео, прошел большую часть курса Core так что считаю, что какое-то мнение о курсе с точки зрения обучающегося высказать право имею.
Так вот — лично для меня(моего склада ума, психотипа и т.д.) Головач оказался просто божественным преподавателем (я таких за весь ВУЗ пару человек вспомнить могу только).
В чем его высокий уровень преподавательского мастерства выражается (опять же с моей точки зрения):
1. Он очень хорошо придумывает и подбирает абстракции при объяснении устройства JVM, работы компилятора, ООП и т.д.
2. Очень хорошо удерживается на уровне преподавания материала — его не заносит в дебри из которых потом некоторые преподаватели выбраться не могут и до конца лекции и т.д. — все идет четко, последовательно и по плану.
3. Его лабы составлены, как если помните в СССР книжки издавались типа «100 загадок и отгадок.», т.е. ответ на загадку (лабу) , если ты нашел правильный ответ — очевиден, что в принципе мне как «халявному слушателю» его курсов, не имеющему возможности послать его проверяющему на проверку является просто громадным плюсом. Т.е. если ты промучался над какой-то лабой пару дней, но ответ нашел — ты сразу понимаешь, что нашел правильный ответ.
4. Его лекции интересны и не вызывают желания заснуть — он приводит интересные примеры, показывает интересные фичи работы компилятора или JVM, под конец утомительных, высоконагруженных материалом лекций «юморит», чтобы слушатели могли на пару секунд расслабиться и потом опять в тонусе его дальше слушали.
5. В отличие от некоторых Российских курсов(не буду их называть), которые ориентированы на то, чтобы дать поверхностные знания и обмануть собеседующего (ну типа той хрени которая меня в ВУЗе раздражала больше всего: «Вы это учите, чтобы сдать экзамен.») у Головача, кроме кучи тестов и т.д. идет довольно глубокое преподавание материала. По каждой из тем, которые я прошел и все лабы выполнил лично для меня не составляет проблемы «копать вглубь», т.к. я понимаю как это работает и что мне объясняет автор, забурившийся в конкретные ньюансы данной темы в своем проекте. А не так — тему прошел, все тесты сдал, а потом открыл узкоспециализированную статью на хабре по этой теме и ничего не понял, т.к. учил тему, чтобы тесты сдать.
6. Честно рассказывает о том, как построены производственные отношения между программистом и работодателем с точки зрения наемного работника, о типах карьерного роста в аутсорсе и т.д. Нет, не с позиций «как поиметь работодателя, а лучше нескольких и сразу», а опять же четко, структурировано говорит о различных вариантах, подходах, стратегиях — короче перечисляет возможные пути роста, чтобы каждый мог выбрать тот, который подходит именно ему.

Да наверное можно много чего еще перечислить, но могу сказать одно — лично мне он совершенно бесплатно дал возможность изучить Java до уровня джуна по записям своих лекций, причем этот процесс скорее похож на «прокачку» в какой-нить MMORPG типа Aion, LA2, WOW — своим стилем преподавания он меня заставил «задротить левел в Java» если так можно выразится — изучение лекции за лекцией идет как получение уровней в игре — взял один, хочется быстрее взять следующий.

Не знаю, поможет ли мне его Core-курс попасть на декабрьские курсы GlobalLogic BaseCamp в Киеве или нет (т.к. курс его Java Junior, я боюсь, что только начну осваивать к началу конкурса на эти курсы) — если пройду конкурс, то обязательно отпишусь, но посоветовать его Курсы то ли в виде самоизучения (если у вас мозги потянут и усидчивости хватит часами самостоятельно их осваивать) то ли записаться к нему на заочные или очные(если Вы из Харькова) если Вам нужно живое общение с преподавателем я бы посоветовал.
По крайней мере — скачайте его первые пару лекций и посмотрите, уверен, что у большинства новичков в Java из тех кому программирование хоть как-то интересно как процесс, а не для того, чтобы «бабла срубить по-быстрому» возникнет желание в той или иной форме.

Вобщем-то этим длинным постом я хотел бы как-то отблагодарить Ивана Головача за то, что фактически благодаря ему я имею возможность с удовольствием освоить Java и надеюсь, что хотя-бы один человек, прочитав этот отзыв посмотрит своими глазами записи его лекций и запишется к нему на курсы.

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

тема кодировок — отдельная тема. к изучению Java она имеет косвенное отношение. лучше не заморачиваться на таких мелочах, сколько символов, сколько кодовых точек и т.п., а сосредоточиться на существенных вещах. если разбирать дотошно так все вопросы — то жизни не хватит и учащийся будет «вечным студентом».

Провожу серию вебинаров как раз на эту тему, можете присоединиться Практический online-интенсив «Подготовка к Java Interview» 10.01.2016

Я себе сделал такую шпаргалку:

Юникод — это стандарт кодирования символов для большинства языков мира, включая вымершие, а также много различных вспомогательных символов (например, математических). Юникод разрабатывает одноименный консорциум (www.unicode.org).
У каждого символа есть официальное именование (например, «latin small letter a») и код (code point) — число от 0 до 10FFFF.

Символ (Character) — наименьший компонент письменного языка, который имеет семантическое значение. Еще одно значение символа — абстрактный символ — единица информации, используемая для управления, организации и для представления текстовой информации.
Глиф — графическое представление символа. Некоторые символы могут иметь различное начертание, например в зависимости от позиции в слове. Но это уже проблемы системы вывода на экран. Сборище глифов, обычно одного стиля, называют шрифтом.

Character set — Набор элементов для представления текстовой информации. Т.е. это просто набор любых символов, например строчные буквы английского алфавита.

Coded character set — character set, у которого каждому элементу присвоен числовой код (code point).

С charset немного сложнее — юникод определяет его просто как синоним coded character set (www.unicode.org/...x.html#charset, а в java это означает encoding — правило отображения кодов символов (code points) в кодовые единицы (code units).

Code point (кодовая точка)- любое значение в пространстве кодов юникода, т.е. сами коды символов.
Code unit (кодовая единица)- битовые последовательности, с помощью которых можно закодировать code point. В юникод используют 3 типа code unit — 8ми битовые (byte), 16ти битовые и 32х битовые.
В большинстве языков программирования (включая java) для внутреннего представления (класс String) используют 16 битные code units, т.е UTF-16. Поэтому, когда вы у строки вызываете метод length, вы получите длину в кодовых единицах, а не количество символов в строке.

Переходим к самому интересному :)
UTF — Unicode Transformation format — способ кодирования кодов символов в последовательности байт.
Есть формы кодирования UTF, а есть схемы. И вообще говоря это не одно и то же.
Формы кодирования — правила разложения кода символа в кодовые единицы (code units). А схема кодирования — правила сериализации кодовых единиц в байты (например, при записи на диск).
Есть 3 формы кодирования — UTF-8, UTF-16, UTF-32.
В UTF-32 каждый код символа кодируется 4мя байтами, т.е. это кодирование с фиксированной длиной (fixed length encoding).
В UTF-8 каждый символ юникода кодируется последовательностью от одного до 4х байт по хитрой схеме (en.wikipedia.org/...-8#Description, т.е. это variable length encoding.
Преимущества данного метода в том, что коды ascii (кодировка, придуманная американцами, соответствуе первым 127 символам в наборе unicode) кодируются без изменений, одним байтом.
В UTF-16 для кодирования кодов символов с номерами больше U+FFFF (их называют supplementary characters) используют суррогатные пары — коды из диапазона U+D800-U+DFFF. Т.е., символы с кодами больше U+10000 кодируются двумя 16ти битными парами. Коды из диапазона суррогатых пар не должны встречаться поодиночке. Пространство кодов с кодами U+0000 — U+FFFF называют Basic Multilingual Plane (BMP).
Схем кодирования семь — UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE.
BE и LE означают big endian или little endian, т.е. в каком порядке идут байты, сначала старшие или сначала младшие. Если не указано и нет BOM, то следует трактовать как BE.
BOM — byte order mark — отметка порядка байтов. Символ с кодом FEFF (неразрывный непечатный пробел) записывают в начале текста. При вычитке проверяют первый байт, если это BOM и код FFFE, значит порядок little endian. Если код FEFF или это не BOM, то порядок big endian.
Никто не запрещает записать BOM в текст, закодированный в UTF-8 — но делать так не стоит, особенно в unix-подобных системах. У Microsoft особое мнение по этому поводу,поэтому notepad таки вставляет в текст в UTF-8 BOM :)
Если вы такой текст прочитаете в java, получите 3 кракозябла в начале.

Существует также стандарт кодирования от ISO/IEC, ISO-10646, который совместим в юникодом по кодам символов и названием этих символов

P.S.
И не пытайтесь написать свой кодер\декодер из\в UTF-8. У вас не получится (написать полностью корректный, который правильно обрабатывает многочисленные malformed последовательности). А если и получится, то значит вы убили кучу времени на изобретение велосипеда %)

насчет charset в java я не прав — там это тоже coded character set.

Думаю нужно ещё отметить правила «Charset», по которым мы сможем получать из ключа "codepoint"а массив "Codeunit"ов, и наоборот но до этого нужно разобрать что представляют из себя формы кодирования.
Я написал так).

import java.nio.charset.*;
import java.util.*;

public class Encode2 {
public static void main(String args[]) {
Map availcs = Charset.availableCharsets();
Set keys = availcs.keySet();
for (Iterator iter =
keys.iterator();iter.hasNext();) {
System.out.println(iter.next());
}
}
}

После вывода мы получим список доступных #charset#ов.
То есть #charset#ы это правила кодирования, перечисленные выше выводом на консоль.

Этот текст был в первом варианте, моего ответа Ивану, но я посчитал его очень громоздким, и урезал его на половину. Надеюсь не чего лишнего не вырезал).

И не пытайтесь написать свой кодер\декодер из\в UTF-8. У вас не получится
Вот, кстати, в учебных целях (вспомнить как байты туда-сюда двигать) и при наличии времени очень даже полезно. Неплохая прикладная задачка.
А главное — есть уже реализованное решение и можно проверить результат по всему диапазону на готовом велике) ...

ну как возможность подвигать байты, то да, полезно )

(класс String) используют 16 битные code units, т.е UTF-16. Поэтому, когда вы у строки вызываете метод length, вы получите длину в кодовых единицах, а не количество символов в строке.
Для String str = new String(new char[]{55378, 56816}); — кодовая единица в UTF-16 одна, а str.length() возвращает 2. Кол-во кодовых единиц вернет str.codePointCount(0, 2). Так что же мы получим вызвав length()?

кодовые единицы это code units, их количество и возвращает метод length. А str.codePointCount(0, 2). вернет количество кодовых точек (кодов юникода).

спасибо большое. мне помог этот комментарий, смог разложить все по полочкам

Символ (character) — единица информации, которая соответствует письменному символу (графема) естественного языка общения. «?», «A», «+», к примеру.
Каждая из графем (или набор графем), отображенных на Вашем мониторе, представляет собой глиф. Глиф (glyph), как единица графики, является графическим отображением графемы. Glyph символа процента или «собака», в конкретном случае, выглядят как «%», «@».
Определенный стиль отображения глифа, с учетов размера, насыщенности, удобочитаемости и других характерных особенностей, это и есть шрифт (font). Примером современных компьютерных font’ов могут быть всем известные Arial, Calibri, Times New Roman и др.
В промежутке между тем как символ языка общения в виде character отобразится на мониторе (к примеру) в виде glyph’а определенного font’а, происходит «конклав» кодировки. Процесс перевода каждого character на машинный язык требует определенного стандарта.
Coded character set определяет как представить character в виде целого числа, которое называется code point. Для примера, символ представляющий большую букву «А» (лат.) имеет номер 65 (в ASCII). Один из первых coded character set — ASCII (American Standard Code for Information Interchange) — американский кодировочный стандарт для печатных символов и некоторых специальных кодов. ASCII представляет собой кодировку из 128 символов для представления цифр, латинских символов, знаков препинания и управляющих символов, каждому символу соответствует 7-ми битное значение целого числа. В целом на этом можно было бы и остановиться, если бы не наличие многих других символов различных письменностей, которые в ASCII учтены не были, да и 7-ми битная кодировка нравилась не всем. Что привело к развитию других систем кодирования символов — возникла, как минимум, проблема совместимости.
Таким единым стандартом является Unicode (юникод) — стандарт кодирования символов, который представляет практически все возможные знаки письменности. Изначально кодовое пространство Unicode включало 65536 code points. В дальнейшем кодовое пространство Юникода было расширено до 1 112 064 code points. Где первые 65 536 - первоначальное пространство 16-битных представлений символов, 2048 — количество значений забронированных для элементов суррогатных пар (от 55 296 до 57 343), 1 048 576 — пространство для символов не вошедших в первый диапазон (Basic Multilingual Plane) — supplementary characters. В итоге пространство Юникода разбилось на 17 плоскостей, где 0-ая плоскость — Basic Multilingual Plane — со всеми наиболее часто используемыми символами.
Один из методов, с помощью которого Юникод мапится на character set — Unicode Transformation Format encoding (UTF) . Этот метод породил 3 известные кодировки: UTF-8, UTF-16, UTF-32

А что такое этот самый «UTF», если «их» так много?

>> [65]
>> [-2, -1, 0, 65]
>> [0, 65]
>> [65, 0]
>> [0, 0, 0, 65]
>> [0, 0, 0, 65]
>> [65, 0, 0, 0]

>> [65] — использована кодировка UTF-8 — 8-ми битный формат преобразования Юникода, что для символа «A» являет собой один байт и совпадает со значением кодировки ASCII. Первые символы Unicode полностью соответствуют кодировке ASCII.

>> [-2, -1, 0, 65] — кодировка UTF-16 — 16-ти битный формат преобразования Юникода. UTF-16 имеет представления UTF-16BE и UTF-16LE, что значит Bid Endian и Little Endian — по сути требование компьютерной архитектуры, которая использует многобайтные значения со старшим байтом в начале (Little Endian) или старшим байтом в конце (Big Endian). BE и LE — метки порядка байт или понятным языком byte order mark — BOM.
По умолчанию UTF-16 использует Big Endian, чтобы неявно это обозначить, в начало строки (в нашем случае «A») вставляется два байта обозначающие то самое Big Endian. Эти байты [-2, −1] в начале сроки, U+FEFF и U+FFFE в шестнадцатеричном представлении — непечатные символы в Unicode.
>> [0, 65] >> [65, 0] — теперь легко можно понять порядок байт и отсутствие BOM в начале строки.
>> [0, 0, 0, 65] >> [0, 0, 0, 65] >> [65, 0, 0, 0] — такая же ситуация как и в случае с использованием кодировки UTF-16 за исключением того что кодировка UTF-32 — система кодирования фиксированной длины Fixed width encoding — каждый символ Юникода должен быть представлен в виде 32 бит. Преимущество UTF-32 заключается в том что каждый code point представляет конкретный code point юникода. Тем не менее, UTF-32 достаточно тяжеловесный по тем же причинам.

Почему строка в которой в два раза больше букв (2 вместо 1) занимает в только 1.5 раза больше места?

System.out.println("A".getBytes("UTF-16").length);
System.out.println("AA".getBytes("UTF-16").length);
>> 4
>> 6
>> 4 — очевидно почему 4 байта(неявное указание BE занимает первые 2 байта).
>> 6 — каждый следующий символ кодируется 2-мя байтами, как это и предусмотрено системой кодирования UTF-16, поэтому добавление следующего такого же символа добавляет всего два байта.

Если UTF-8 так хорош (как все говорят), почему он занимает так много места (и чем он тогда хорош)?
System.out.println("ЭЮЯ".getBytes("UTF-8").length);
System.out.println("ЭЮЯ".getBytes("latin1").length);
>> 6
>> 3
>> 6 — каждый символ кодирован 2мя байтами т.к. символы «ЭЮЯ» выходят за пределы однобайтного представления в UTF-8.
>> 3 — каждый символ кодирован 1м байтом т.к. символы «ЭЮЯ» кодируются cp1251 — широко используемая 8-ми битная кодировка (подобно ASCII) для кириллических символов.
Как строка из одного символа может сохраняться в разные размеры байтовых массивов

char ch;
ch = 0x0001;
ch = 0x0111;
ch = 0x1111;
>> [1]
>> [-60, -111]
>> [-31, -124, -111]
Учитывая то, что UTF-8 (как и UTF-16) — Variable width encoding — система кодирования, использующая коды различной длинны для представления символов.
ch = 0×0001 — входит в диапазон code points 0×0000 — 0×007F, который представляет символы одним байтом — 0xxxxxxx.
ch = 0×0111 — code points 0×0080 — 0×07FF — 2х байтное представление 110xxxxx 10xxxxxx.
ch = 0×1111 — code points 0×0800 — 0xFFFF — 3х байтное представление 1110xxxx 10xxxxxx 10xxxxxx.
Где каждый байт — Code unit — минимальный набор бит, который представляет единицу кодированного текста. Для UTF-16 — code unit состоит из 16 бит и из 32х для UTF-32.

Все таки в этой строке ОДИН символ или ДВА?

>> �
>> 2
>> 1
>> ?
>> ?
В этой строке один символ.
Метод length() возвращает кол-во знаков char в строке. И если бы, допустим, мы на основе этого метода пытались выделить количество ячеек для имени китайца на китайском языке, то ячеек всегда оказывалось бы больше чем китайцу нужно.
Метод codePointCount(0, 2) вернул количество символов соответствующих стандарту Юникод(то что нужно китайцу) — 1 символ. Символы, которые лежат выше BMP или следующие за code point U+FFFF (65535) называются supplementary characters. Это символы Юникода — пары 16-битных знаков char, которые называются суррогатными парами (surrogate pair). Два знака char — суррогатное представление символов Юникода в диапазоне от U+10000 до U+10FFFF.

Почему строка в которой в два раза больше букв (2 вместо 1) занимает в только 1.5 раза больше места?
Если попробовать далее ввести еще «ААА» или «АААА» будет 8 и 10 байт.А разгадка одна — символ конца строки занимает 2 байта.
Если UTF-8 так хорош (как все говорят), почему он занимает так много места (и чем он тогда хорош)?
UTF-8 хорош тем что совместим со старыми неуниверсальными кодировками.Какой-нибудь американец прочтя твою юникод-строку увидит ее как она должна быть, а не набор мусора вида ???$. Это очевидно, и этим и хорош.
Говорят, что документы в UTF 8 становятся в два раза больше, чем в старых кодировках. Это миф из разряда «слышал звон, да не знаю, где он». На самом деле — раз на раз не приходится. Например, если документ состоит только из символов ASCII (латинские буквы, цифры, знаки препинания и т. д.) — то в кодировке UTF 8 он будет занимать ровно столько же байтов, сколько в любой другой. Если документ содержит только буквы русского алфавита и никаких других символов (что, согласитесь, бывает достаточно редко) — то в UTF 8 он действительно станет в два раза больше. А если в нём, например, поровну русских и арабских букв — в UTF 8 он будет в два раза меньше, чем, например, в Windows 1251 или Asmo 708.
Например,страница которую вы читаете на сайте , в кодировке UTF 8 занимает 35 килобайтов. А если перевести её, например, в Windows 1251, она будет занимать 26 килобайтов. Кстати, сравнивая страницы, посмотрите, насколько легче читается код в UTF 8.
[spoiler]Небольшое отступление,но все так же о весе[/spoiler]
Рассуждая о «весе» веб страниц, следует отметить, что основную часть этого веса обычно составляет не код HTML, а изображения. (А также, возможно, другие объекты: ролики Flash, файлы JavaScript и т. д.) В результате даже в тех случаях, когда документ в UTF 8 увеличивается — это практически незаметно в общем объёме данных. По моему, «разбухание» кода на несколько процентов — недорогая цена за главное преимущество UTF 8, с которого мы начали.
Тем, кто заботится о «весе», следовало бы в первую очередь выкинуть из кода устаревшие атрибуты HTML (вроде cellpadding или valign) и подстановки для тех символов, которым они не нужны (например, — для длинного тире или для неразрывного пробела). Действительно, иногда доходит до маразма — некто упирается: «Не буду делать страницы в UTF 8, потому что они от этого увеличиваются» — а сам при этом ваяет код с жуткими атрибутами и подстановками, который без них мог бы быть в пять раз короче.
Использование latin1, как заметил Mike Gorchak приводит к некорректному результату, лучше взять cp1251.
latin1 используется для латинских символов. UTF-8 можно использовать практически для любых символов в мира, включая китайский, японский, иврит и кириллица, и т.д. Latin1 был де-факто стандартом в первые годы Интернета.
А что такое этот самый «UTF», если «их» так много?
UTF — это единая система кодирования символов из разных языков, определяющая не только способ их отображения, но и правила сравнения символов из разных языков. В кодировке UTF-16 каждый символ занимает по два байта, в UTF-8 — от одного до шести, в зависимости от языка. Символы ACSII (латиница) кодируются в UTF-8 одним байтом, отсюда и его популярность (потому что пиндосы жмутся предварять свои буквы нулевыми байтами)
Разные UTF — это разные способы преобразования юникодных символов в байты. Юникод каждой букве, грубо говоря, сопоставляет число. UTF-8/16/32 и т.п. каждому такому числу сопоставляют последовательность байт. В UTF-8 это от 1 до 6. Символам с кодом меньше 128 сопоставляется один байт (такой же, как был в ASCII, этим UTF-8 и хорош, если программа работала с ASCII-строками, то очень часто она не будет сильно глючить со строками в UTF-8), большинству символов европейских алфавитов — два, более редким — три и более. В UTF-16 основные символы (даже с кодами меньше 128) занимают два байта, более редкие — 4.
Как строка из одного символа может сохраняться в разные размеры байтовых массивов
Большинство из наиболее часто используемых представляются двумя байтами называемой базовой многоязычной матрицей (BMP) , получив указатель на байты и пройдя на n позиций с шагом 2 байта, попадёшь на n-ю букву(символ).Это справедливо только для Basic Multilingual Plane (BMP).Некоторые символы состоят из двух «чаров» ,когда мы обращаемся к первому символу,то в нем указанно,что он является помеченным.[spoiler]Это не номер символа юникод[/spoiler]И для того чтоб получить конечный символ/букву/число/иероглиф нам необходимо прочитать следующий.В разных кодировках символы могут кодироваться разным количеством байт
Все таки в этой строке ОДИН символ или ДВА?
Для не-BMP символов UTF-16 представляет суррогатные пары,поэтому здесь у нас один символ.
Если попробовать далее ввести еще «ААА» или «АААА» будет 8 и 10 байт.А разгадка одна — символ конца строки занимает 2 байта.
скорее комбинация символов (the last two code points of the BMP, U+FFFE and U+FFFF) обозначающих endianness по умолчанию.
...unmarked form uses big-endian byte serialization by default, but may include a byte order mark at the beginning to indicate the actual byte serialization used. Asmus Freytag.
А если в нём, например, поровну русских и арабских букв — в UTF 8 он будет в два раза меньше, чем, например, в Windows 1251
что значит арабские буквы в Windows 1251? Вы уже не первый кто говорит о кодировании арабского <>текста<> в 1251.
что значит арабские буквы в Windows 1251? Вы уже не первый кто говорит о кодировании арабского <>текста<> в 1251.
С одного конспекта переписывали

вроде все мы с конспекта черпаем (за исключением reality hacker, он с момента зачатия все знает), видимо конспекты разные))

Меня не зачинали, я самосгенерировался

агентура не спит?

скорее комбинация символов (the last two code points of the BMP, U+FFFE and U+FFFF) обозначающих endianness по умолчанию.

Код BOM — U+FEFF, а не U+FFFE. А U+FFFF вообще тут ни при чём.

спасибо! сам не ведаю, чего творю...

После того как посмотрел лекцию Ивана:
www.youtube.com/...UuyfzxU4brinuTI мне многое стало понятно )).
Насчёт того нужна или нет информация о кодировках — для меня эта лекция была очень полезна, я например раньше не понимал как настроить IDE чтобы русские комментарии, русский вывод на консоль нормально отображался в разных редакторах. Почему файл Питона набранный в Линукс не хочет отображать нормально русские буквы в Виндоус. Как закоренелый пользователь Виндоус я признавал только 1251. Когда то я писал перекодировщики из разных досовских кодировок в cp1251, но Unicode оставался для меня тайной покрытой туманом. Вроде и ясно что два байта на символ, но всё равно знания какие-то зыбкие. Но теперь то я обрёл уверенность))

Я попытаюсь ответить на вопросы Ивана, и надеюсь он исправит меня если я где-нибудь ошибусь.
Основная причина описанных Иваном странностей связана с различными интерпретациями Unicode’a. Надо сказать, что Unicode — это не шрифт, это не кодировка и не кодовая страница (code page). Unicode — это множество пронумерованных символов (coded character set). Каждому символу присвоен порядковый номер. Каждый символ (character) входит в это множество один раз. То есть символ латинского алфавита «а», буква кириллицы «Э», символ градусов Цельсия «°» и многие другие имеют свой номер. Например латинская «а» имеет номер 97, русская «Э» — 1069 (0×42D), а египетский иероглиф похожий на самолёт имеет номер — 0×13266 (78_438). Когда на землю прилетят инопланетяне их символы также пронумеруют и внесут в это множество.
Символ «Э» может иметь огромное количество возможных форм отображения(glyph). Маленькие, большие, bold, italic, Times New Roman, Arial. Всё это зависит от применяемого шрифта (font) и не имеет никакого отношения к Unicode. Если можно так сказать font’ы и Unicode относятся друг другу перпендикулярно — они не влияют друг на друга.

Как показано выше Unicode имеет в своём составе символы с номером больше 78.000. Как же оперировать с такими символами? Какой выбрать размер данных чтобы их хранить — byte, int, long, char?
И тут возникают различные правила отображения Unicode в соответствующие им байты. Это — Charset. Существуют Charset’ы отображающие символ "а«(номер 97) в один байт, в два байта, или в четыре байта.
Charset UTF-8 отображает символы от нулевого до 127-го в один байт. В этом чарсете выгодно хранить тексты на английском языке. Этот чарсет наверно самый сложный потому что имеет разную длину данных для разных символов. Для русских букв это уже будет два байта, для китайских иероглифов три или четыре (точно я не знаю). Поэтому ch = 0×1, ch=0×111, ch=0×1111 из обсуждаемых примеров и отображаются соответственно в 1, 2 или в 3 байта. Я не буду описывать правила отображения символов в этом чарсете. У меня не получится это сделать кратко (правила там не сложные , но слов понадобится много и ещё картинки придётся рисовать), желающие могут обратиться к Википедии (en.wikipedia.org/wiki/UTF-8.

Charset’ы UTF-16, UTF-16LE, UTF-16BE отображаются на двухбайтные char’ы. Символы от 0 до 65_535 описывают все современные алфавиты мира (Basic Multilingual Plane (BMP)) и описываются двумя байтами. Мертвые языки и дополнительные символы записываются четырьмя байтами.
При разработке UTF-16 учитывалось наличие компьютеров с разной архитектурой памяти. Я имею ввиду BigEndian и LittleEndian. В название чарсетов прямо указано какое направление данных в памяти. Для UTF-16 (без LE и BE) порядок байтов определяют первые два байта текста — 0xFF 0xFE (-1 −2) соответствует UTF-16LE , 0xFE 0xFF - BE. Данный нетривиальный приём обозвали Byte Order Mark (BOM), Всё это видно в одном из примеров выше.
UTF-32 отображается в четыре байта. Как видно из рассматриваемого примера UTF-32 и UTF-32BE синонимы.

UTF-32 имеет фиксированную длину данных для каждого символа (fixed length encoding), что позволяет легко и быстро его обрабатывать. Осуществлять быстрый поиск, вставку в файлы. UTF-8 и UTF-16 имеют переменный размер для символов (variable length encoding), что не позволяет например найти мгновенно 1_000_000’ый символ в файле. Но за счёт того что символы с номерами не входящими Basic Multilingual Plane найти в документах достаточно сложно в основном применяются именно UTF-8 и UTF-16.
UTF-8 и UTF-16 имеют переменную длину и для того чтобы записать достаточно большие символы (для UTF-8 свыше 0×7FF, для UTF-16 свыше 0xFFFF) будут использоваться три или четыре байта, в таких случаях в Java применяются два char’a (их называют supplementary characters или surrogate pairs). Возникающие при этом странности (когда в используемом font’е нет изображения соответствующих символов) показаны в последнем примере

Надо сказать что Unicode не единственный используемый набор символов (coded character set), до стандартизации Unicode на протяжении 40 лет было составлено огромное количество кодовых страниц -ASCII, KOI-8, CP-866, CP-1251. Три последние являются русскими кодировками. Они фактически являются и «coded character set» и " Charset " одновременно. Связанно это с тем что они содержат по 128, 256 символов и отображаются напрямую в один байт. В исправленном примере выше чарсет «latin1» является синонимом чарсета " ASCII «. Да эти чарсеты очень экономны, экономней их могут быть они же самые только зазипованные. Но в современном мире, где пользователь во Вьетнаме открывает веб-страничку американской компании, сайт которой разработали где-то в Индии, при использовании старых чарсетов у него есть довольно большая вероятность увидеть странные «кракозябры». Именно по этой причине Unicode и получил такое распространение.

В середине 90ых произошло событие которое возможно наши потомки через тысячу лет будут считать главным событием этого времени. Нет это не возникновение интернета, не появление компьютеров, не исчезновение СССР. Это событие — появление Unicode. Да, вот так неожиданно!
Сколько языков программирования, технических новинок появиться за ближайшую тысячу лет, сколько государств возникнет и распадётся — им нет числа. А Unicode продолжит существовать, к тому времени в него включат алфавиты инопланетян и он будет проходить незаметной нитью сквозь все программные продукты будущего. Он будет присутствовать в комментариях первых программ квантовых компьютеров, при помощи его будут описаны спецификации компьютеров которые придут им на смену, первые семантические процессоры искусственного интеллекта будут пропитаны им. Вся текстовая информация передающаяся по галактической телепатической информационной сети будет описана при помощи Unicode.

но Unicode оставался для меня тайной покрытой туманом. Вроде и ясно что два байта на символ, но всё равно знания какие-то зыбкие.
Разве два? как на счет символа, code point которого в Unicode равен 1112064?
Для UTF-16 (без LE и BE) порядок байтов определяют первые два байта текста — 0xFF 0xFE (-1 −2) соответствует UTF-16LE
кажется проблемы с пунктуацией иначе как обьяснить отсутствие комбинации (-1 −2) при явном указании LE-BE:
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")));

>> [-2, −1, 0, 65]
>> [0, 65]
>> [65, 0]

До 0×7F, т.к. 0×7FF — уже воспользовался возможностями переменной длинны?

имеют переменную длину и для того чтобы записать достаточно большие символы (для UTF-8 свыше 0×7FF

1.До того как я посмотрел лекцию Ивана, я считал что символы Unicode’а всегда занимают два байта и что их всего 65000 (да, для меня эта лекция была полезной)
2.Проблемы с точной передачей смысла — имелось ввиду то, что (-1 −2) обозначает что дальше данные сохранены в LittleEndian формате
3. от 0×7f до 0×7ff UTF-8 сохранит символ в два байта, но в Java это будет всё ещё один char

3. от 0×7f до 0×7ff UTF-8 сохранит символ в два байта, но в Java это будет всё ещё один char
char один, но машинное представление мультибайтное, что в случае с UTF-8 указывает на variable width encoding. я не прав?

да, правильно
в variable width encoding изменяется количество байт на один символ.
(Tо что в этом диапазоне количество байт равно двум) AND (и в диапазоне который был ниже, каждый символ представлялся одним байтом) —> (обозначает что UTF-8 является variable width encoding)
Но суррогатные пары появляются только в диапазоне выше 0×7FF

Обманул, оказалось всё сложнее.
Проверил себя и выполнил следующий код
char c1[] = {0xFF00}; String str1 = new String (c1); System.out.println(Arrays.toString((str1.getBytes("UTF-8")))); System.out.println(str1.length()); >>[-17, -68, -128] >>1
То есть символы выше 0×7FF будут сохраняться в одном char’e

А с суррогатными парами следующая история:
Unicode имеет два диапазона [0xD800, 0xDBFF], [0xDC00, 0xDFFF] — в каждом диапазоне по 1024 значения.
В этих диапазонах символы не определены. Они используются для того чтобы в UTF-16 отображать символы от 65_536 до 1_100_000.
Комбинируя один char из первого диапазона, второй из второго мы получаем суррогатную пару (surrogate pair) и их возможное количество (миллион) определяет множество дополнительных символов (supplementary characters)

Таким образом в UTF16 мы можем закодировать следующее количество символов 65_536 — (1024 +1024) +1024 *1024 .

В UTF-8 и в UTF-32 суррогатные пары не используются это просто пропуск в длинном списке символов.

То есть символы выше 0×7FF будут сохраняться в одном char’e
более того, до 0хFFFF все символы будут представляться одним знаком char.
В UTF-8 и в UTF-32 суррогатные пары не используются это просто пропуск в длинном списке символов.
думаю, не правильно! Все символы Юникода в т.ч. и суррогатные пары кодируются любой из UTF кодировок. В UTF-8 — четырьмя code units, в UTF-34 — одним(4х байтным) code unit

закодировать можно, но использовать нельзя

можно закодировать символ \u 0xD802, но в UTF-8 он никакой информации не несёт — если он встретился вUTF-8 то это значит скорее всего что файл в данном месте повреждён

какую информацию он несет в УТФ-16?

В UTF-16 с ним в паре должен идти char из второго диапазона [0xDC00, 0xDFFF], то есть возможно 1024 варианта последующих char’ов. Так потенциально образовать 1024 символа Unicode’a.

Для UTF-8 и UTF-32 нет необходимости прибегать к таким сложностям для кодирования символов с номером свыше 65тыс.

Доброе время суток, я как слушатель лекций Ивана, не хотел бы уходить от темы поста;)
Начну свой ответ на вопрос Ивана с понятий которые приведены в данной теме, а за тем отвечу на вопросы дабы раскрыть суть:
«Character» я понимаю это как уникальный символ отличный от других ( буква, иероглиф; цифра) и т.д.
А вот «Character set» это набор этих символов. Может быть, что набор этих символов состоит только из нескольких(морзянка 3 символа, но перекодирование совокупности этих символов нам даст словосочетания) или множества(иероглифы которые в совокупности тоже что-то несут понимающим товарищам).
«Сoded character set» нумерация «Character» в  «Character set» , допустим у нас есть множество "Character set"ов как в Unicode, каждый из этих наборов находится в каком то диапазоне номеров, например кириллица — это набор "Character set"ов, в нём находится 432 символа (исторических, современных, не славянских и славянских языков (0×0400 до 0xA69F)) почему диапазон, по причине того что некоторые языки могут иметь якобы символы которые забыты, но вдруг кто-то вспомнит о них как это было уже не один раз, и размер юникода всё больше вырастает, но создатели этой последовательности наконец остановились на отметке которая составила 1 112 064 "Character"ов. Это не значит что на нашей планете столько символов было найдено. Mежду "Character set"ами есть пробелы, в случае если найдётся дополнительный символ связанный с этим набором "Character set"ов, дабы не сдвигать номера соседних "Character set"ов понадобились пустые зарезервированные номера привязанные к определённым наборам "Character set"ов.
Что же такое Unicode — это наборы практически всех знаков письменных языков "Character set«ов, предоставленных нам для использования в нумерованном представлении. Этот стандарт не единственный в своём роде, но он охватывает все предыдущие стандарты. Исторически сложилось так, что первые разработчики компьютеров были носителями английского языка, и разработка первой кодировки предоставлялась им. Она получила название ASCII (American Standard Code for Information Interchange), на этом всё не остановилось, и расширялось таким образом что бы собрать все кодировки вместе объединив их под одним стандартом Unicode.
Большинство символов используемых в основных языках мира занимают 65 536 code points(к которым мы вернёмся позднее) и образуют Basic Multilingual Plane (BMP) (Основной Многоязычный Уровень). Оставшиеся (более миллиона) code points вполне достаточно для кодирования всех известных символов, включая малораспространенные языки и исторические знаки.
Теперь давайте разберём что такое «Codeunit» ,"Codepoint" и «Codepoint» -это так называемое нумерованное положение в кодировке. Перейдём теперь к «Codeunit», и потом их совместим для детального рассмотрения. "Codeunit«- это тип хранения состояния для обработки в данный момент. Существуют, по крайней мере в моём представлении две формы «Codeunit» — это байты и символы. Почему я написал про состояние для обработки в данный момент давайте разберём детально. Мы работаем со строками в данном случае, можем воспользоваться для удобства "char«амии, но есть необходимость в форме с байтами, там где символы недопустимы. Например мы захотим передать символы функционалу который с символами не работает, а работает непосредственно с байтами по этой причине «Codeunit» может принимать различные формы. Так что же такое «Codeunit» — это форма представления символа по ключу"Codepoint«, в массиве ключей «Сoded character set». Теперь плавно перейдём к самим символам и разберём что такое «glyph» и «font». «Glyph» — это наша картинка, изображение нашего символа в каком то стиле, а «font» это разнообразные стили отображения "glyph«ов. Всё было бы хорошо, и не плодилось бы столько различных терминов, если бы все символы помещались в unsigned char. И в нашем случае породило ещё один термин называемый «supplementary characters» или суррогатные пары. Проблема заключается в том, как нам быть если мы вышли за максимальные рамки положительного "char«а. И так «supplementary characters» означает что несколько значений составляет один символ. В пример можно привести китайские иероглифы, в большинстве "Character set«ов имеются символы суррогатные пары, например в русском языке это «Ё», она состоит из E(0×0415) и двух точек(0×0308).
Думаю нужно ещё отметить правила «Charset», по которым мы сможем получать из ключа "codepoint"а массив "Codeunit«ов, и наоборот но до этого нужно разобрать что представляют из себя формы кодирования.
Стандарт UNICODE поддерживается тремя формами, 32-битной (UTF-32), 16-битной (UTF-16) и 8-битной (UTF-8), плюс для 32-битной и 16-битной кодировки. Существует дополнительные способы кодирования, которые отличаемы приставками BE и LE. BE и LE расшифровываются как big-endian (BE), дословно «тупоконечный» — порядок байт от старшего к младшему, и little-endian (LE), дословно «остроконечный» — порядок байт от младшего к старшему. Начнем с 8-битной (UTF-8) так как она практически везде устанавливается по умолчанию. Почему? Пока английский язык будит международным, и большинство текстов написано на нём, он будет самым употребляемым. Но есть маленькое но! — смотря с какими текстами мы будим работать, нам нужно выбирать подходящий для нас. Например если у нас только русский текст и его много, то стоит остановиться на Win — 1251. Например, если документ состоит только из символов ASCII (латинские буквы, цифры, знаки препинания и т. д.) — то в кодировке UTF — 8 символ будет занимать ровно столько же байтов, сколько в любой другой. Если документ содержит только буквы русского алфавита, и никаких других символов — то в UTF — 8, он действительно станет в два раза больше. А если в нём, например, поровну русских и арабских букв — в UTF — 8 он будет в два раза меньше, чем, например, в Win — 1251. Вот теперь можно перейти к другим кодировкам менее популярным. Далее появилась «UTF-16» почему 16 по причине расширения границ кодировки (2 в 16 степени) 65536 в отличии от «UTF-8» которая составляла (2 в 8 степени) 256. «UTF-32» В отличии от его старших но ростом не вышедших братьев которые используют переменное число битов для представления символов "Unicode«а, он использует все свои 32 бита для кодирования символов хотя это число не превышает 1м+. Преимущество его в доступе к символам занимающей одинаковое количество единиц времени, а недостаток — в размере четырёх байт на любой символ.

Думаю нужно отойти от терминологии, и перейти к ответам на вопросы по теме Ивана.

Почему строка в которой в два раза больше букв (2 вместо 1) занимает в только 1.5 раза больше места?
По данному коду мы раскодили «A» в UTF-16, и мне нужно копнуть поглубже рассказав почему «A» в UTF-16 = 4, а «AА» в UTF-16 = 6. UTF-8 для хранения одного символа достаточно 1 байта, UTF-16 нужно 2 байта на символ, и UTF-32 как я выше говорил занимает максимальное количество байтов 4, возможно хранить и в 6 байтах значение символа, но они не включены в стандарт Юникода. Так по чему же 4 на один символ в UTF-16? Как я упоминал выше есть дополнительные BE и LE маркеры, и вот почему наш первый символ распух. Если мы указываем LE, то в начало нашего массива байтов записывается маркер последовательности байтов, который указывает что кодировка LE .Сейчас пойдём ещё глубже, и я напишу что такое big-endian и little-endian. И так BE это порядок байт от старшего к младшему, дословно можно перевести как «тупой конец» от старшего байта An.....Ао к младшему, LE перевёртыш от младшего Aо .....An к старшему. BE это как бы стандарт, его также называют «сетевым порядком байт». Так вот если мы не указываем что наша кодировка BE или LE, то в начале нашего массива байт будет маркер, соответствующий BE или LE. А если мы явно указали BE или LE, то этот маркер в наш массив не входит.
И так UTF-8 был написан для работы с восьми битными символами, но в них нет ни Украинского, и нет Русского. В общем если мы не из ASCII, то будьте добры использовать не 1 байт, а размер от 2 до 6 байт. Но 6 байт как я говорил не используется, для суррогатных пар достаточно 4 байт.

Использование latin1, как заметил Mike Gorchak приводит к некорректному результату, лучше взять cp1251.
Я думаю прочитав ответ выше всё будит понятно. Но дополним что такое cp1251 — эта кодировка содержит: русский украинский, белорусский, сербский, македонский болгарский, в общем это наш ответ ASCII.

А что такое этот самый «UTF», если «их» так много?
UTF-8 [65] = «A» eng, это ASCII и оно помещается в 1 байт, и поэтому в консоли у нас число 65, который в свою очередь является кодом, буквы "А«eng.
UTF-16 [-2, −1, 0, 65] = так как это UTF-16 то под символ мы задействуем 2 байта, на которые указывает 0(первые 8 бит) который не задействован в букве «А», и код той самой «A», остальные байты указывают нам на то, что мы не указали явно что это BE или LE.
UTF-16BE [0, 65] = В данном случае, мы явно указали что это BE, значит «от старшего байта An.....Ао к младшему».
UTF-16LE [65, 0] = LE указывает на — «от младшего Ao......An к старшему»
UTF-32 = мы занимаем 4 байта, для любого символа.
UTF-32BE = «от старшего байта An.....Ао к младшему».
UTF-32LE = «от младшего Ao......An к старшему».

Как строка из одного символа может сохраняться в разные размеры байтовых массивов?
Первый символ у нас 0×0001, и мы попали в неиспользуемые символы, но всё равно занимаем 1 байт. Второй символ 0×0111 указывает на символ «d» , но этот символ не является ASCII, это латинская «d» со штрихом(смотрел по таблице Unicode), по этой причине он выходит за рамки стандарта ASCII, и как я оговаривал выше должен занимать от 2 байт. Третий символ 0×1111, он уже занимает 3 байта и называется  Hangul choseong phieuph.

Давайте разберем детальнее:
Начнём с 1 байтного символа, он выглядит как — (0xxx xxxx).
Первые 2 бита нам указывают на то, что это конечный символ. Если первый байт выглядит как — (110x xxxx), то это не полный код символа, а только первая часть на что нам указывает «110», а вот вторая часть (10хх хххх). 10 нам говорит о том, что это только часть одного символа. Так вот в нашем третьем случае этот 3-х байтный массив выглядит примерно так — (1110 хххх, 10хх хххх, 10хх хххх).

Последний вопрос, который мы также рассматривали на лекции в самом начале звучит так: Все таки в этой строке ОДИН символ или ДВА?
И ответ на данный вопрос — один символ, потому что это суррогатная пара, и состоит она из двух символов, но эти символы нелегалы. Нелегальны они по причине того, что отдельные части этого символа не несут полезной информации, кроме той, что символу нужна ещё одна недостающая часть.

Я понял, головач выгнал своих воспитанников постить рефераты на ДОУ.

Не кто не ответил в данной теме по теме), вот и пишем что знаем. А модуль IO, вчера был завершен. Так что можем делится тем что Иван рассказывал.

А копипаст из википедии от твоего колеги почему не считается?

копипаст думаю не преступление, если прочитал и понял как оно устроенно)) думаю он читал.

А какая мотивация копипастить сюда простыни текста? Для тех кто первый день в интернете и не может сам найти статью в википедии можно на крайняк на нее ссылку дать. Единственная мотивация — головач згоняет массовку для втюхивания курсов следующей партии.

а главное понял, и всё же это всё было на лекции !!

Если документ содержит только буквы русского алфавита, и никаких других символов — то в UTF — 8, он действительно станет в два раза больше. А если в нём, например, поровну русских и арабских букв — в UTF — 8 он будет в два раза меньше, чем, например, в Win — 1251
Расскажите нам, пожалуйста, как вы арабские буквы засунули в 1251 и каким образом текст в UTF8 в принципе может занимать меньше, чем тот же текст в 1251

Читайте внимательней, в данном контексте я оговаривал текст а не кодировку.

Расскажите нам, пожалуйста, как вы арабские буквы засунули в 1251

char ar[] = {0×0635,0×0638,0×0610};
String strAr = Arrays.toString(ar);
System.err.println(strAr.getBytes("UTF-8").length);
System.err.println(strAr.getBytes("Windows-1251").length);

Да , усмотрели, спасибо что прочли мою статью). То в чём я ошибся в прицепе нонсенс) так как если в тексте (рус + араб) буквы которых в принципе нет в utf-8, а вот Win1251 выигрывает за счёт половины русских букв.

Это не нонсенс, а довольно серьезная ошибка, которая может показывать бооольшой пробел в фундаментальных знаниях. Все равно что математику помнить число Пи до 100 знаков, но не помнить что нужно делать в формуле длины окружности — умножать Пи на диаметр или делить.

Вы знакомы с тем как пишут статьи, книги, программы? У каждой из этих групп есть так называемые (Тестеры, Редакторы) которые проверяют о чём ты писал, в нашем случае для моей статьи вы мой редактор :). И своим ответом, я имел в виду что для меня, это синтаксическая ошибка, а не моё утверждение и я пишу не учебник а ответ на основе большого количества мною излагаемого материала и мог ошибиться в написанном!

Да , усмотрели, спасибо что прочли мою статью). То в чём я ошибся в прицепе нонсенс) так как если в тексте (рус + араб) буквы которых в принципе нет в utf-8, а вот Win1251 выигрывает за счёт половины русских букв.

Это в абзаце:

Стандарт UNICODE поддерживается тремя формами.....

Лучший ответ на это — «Папа, с кем ты сейчас разговаривал»?
Зачем тут этот кусок несвязного потока сознания из криво описанных и склеенных баянов?

Ваш ход мыслей сложно понять! Мне можно поддержать ваш ответ? Поясните что это было ? Лучший ответ на что ? Мой лучший, вам понравилось или вы не поняли что-то, могу пояснить мне не трудно, а то у папы спрашивать не дело))... Давайте развивать тему)))...

Лучший ответ на что ?

На Ваше сообщение.

Давайте развивать тему)))...

Не хочу. Информацию я предпочитаю получать из связных источников.

Передумал. Не думаю что здравый смысл здесь победит.

Итак.
Вернем обсуждение ближе к теме — к кодировкам.
Попробую ответить на поставленные Иваном вопросы.

>> А что такое этот самый «UTF», если «их» так много? (самый длинный)
Тут все просто и все сложно одновременно.
Вообще-то говоря, Unicode один. Один стандарт кодирования фактически всех символов языков (в т.ч. и иероглифов), математических и др. символов.
При этом выживший в неравной борьбе с конкурентами и юзерами (шутка).
В самом стандарте Unicode определяются так называемые «code points». Это некое целое положительное число привязанное к названию символа.
И тут, на этом этапе, о байтах еще нет и речи.
Байты появляются из «code points» когда мы используем соответствующий Unicode Transformation Format (UTF) — алгоритм преобразования любого
юникод-символа в уникальную последовательность байтов.
К слову, некоторые пытаются переводить «code points» как «последовательность кодовых точек Unicode».
Но, думаю, лучше просто использовать термин «code points».

А вот и эти форматы: UTF-8, UTF-16, UTF-32...
Собственно у каждого стандарта есть свои плюсы и минусы.

>> Если UTF-8 так хорош (как все говорят), почему он занимает так много места (и чем он тогда хорош)?
Ну, «так много места» это ведь относительно...

Windows-1251 (сp1251) — стандартная 8-битная кодировка для всех русских версий Windows. И представить в ней можно только 255 символов.
Для кирилицы хватит, а для остального — нет.
Т.е. если мы хотим текст, в котором используются символы разных алфавитов (знаки валют, например ? ? €) и/или иероглифы — нам нужен Юникод.
А тут «сюрприз» — кирилица вообще, и «ЭЮЯ» в частности, в UTF-8 закодировано двумя байтами.
Вот и получается «ЭЮЯ» в сp1251 — 3 байта, а в UTF-8 — 6 байт.
Тем не менее, UTF-8 может побороться за право существования и при таком перевесе.
Есть мнение, что в среднем UTF страница на русском языке больше, чем стандартная cp1251 всего на 20-30 процентов.
Если же текст на английском, то страница вообще одинакового размера.
Причина — чаще всего — основной вес страницы составляет html-код, javascript, flash, картинки, CSS и т.п.
Т.е. вопрос трафика пересылаемой страницы плавно перетекает в чистоту и оптимальность кода написанной страницы...
В т.ч. «лишние» пробелы, подстановки символов, напр. «—» вместо «-» и пр.

Тут же, к преимуществу UTF-8 можно добавить совместимость с ASCII.
В UTF-8 каждый code point в диапазоне [0...127] сохраняется в 1 байт. Остальные же символы Юникода кодируются последовательностями от 2 до 6 байт.
Т.е. английский текст в UTF-8 выглядит точно так же, как и в ASCII. В случае, если латинские буквы и простейшие знаки препинания (и пробел)
занимают существенный объём текста, UTF-8 даёт выигрыш по объёму в сравнении с UTF-16 и тем более с 32-х битным UTF-32.

>> Почему строка в которой в два раза больше букв (2 вместо 1) занимает в только 1.5 раза больше места?
«A».getBytes("UTF-16«).length >>4
«AA».getBytes("UTF-16«).length >>6

У UTF-16 и UTF-32 при кодировании есть такое понятие, «порядок байтов».
Если в потоке данных старший байт записываться перед младшим, такой порядок называют «little-endian» — UTF-16LE.
Иначе, когда старший байт записываться после младшего, называют «big-endian» — UTF-16BE.
Если мы явно не указываем BE/LE тогда поток имеет порядок big-endian.
Информация о порядке записывается в начало последовательности. И именуют сие — маркером последовательности байтов "byte order mark«(BOM).
Т.о. к байтовому представлению наших строк «A» и «AA» добавилась по 2 байта информации о BOM.
«AAA».getBytes("UTF-16«).length будет равно 8 байт (6 байт из 3-х символа «А» и 2 байта от BOM).
Кстати в UTF-8 BOM’а нет, тут он не имеет смысла.
«AAA».getBytes("UTF-8«).length равно 6 байтов для трех русских «A», и три байта для трех английских "A«(привет, кодирование с переменной шириной).

>> Как строка из одного символа может сохраняться в разные размеры байтовых массивов
Кодировка UTF-8 является кодировкой с переменной шириной кодирования — от 1-го до 6-ти байт.
Например, для кодирования символа в диапазоне кодепоинтов «U+0000...U+007F» используется один байт. «U+0800...U+FFFF» — три байта и т.д.
В диапазоне кодирования одним байтом присутствует ASCII + простейшие знаки препинания + арабские цифры.
В четырехбайтовом диапазоне лежат музыкальные символы, редкие китайские иероглифы, вымершие формы письменности.
В нашем примере указаны code points из разных диапазонов. Соответственно, имеем разную ширину кодирования.

>> Все таки в этой строке ОДИН символ или ДВА?
В этой строке, содержится одна суррогатная пара.

Небольшой экскурс в историю.
В этой жизни все предусмотреть невозможно.
Первоначальная версия Юникода была кодировкой с фиксированным размером символа в 16 бит, (65 536 символов).
Отсюда, кстати, происходит практика обозначения символов четырьмя шестнадцатеричными цифрами (например, U+0321).
Но «внезапно возникшие из ниоткуда» китайцы и японцы смешали все карты.
Некоторое время было принято решение кодировать все символы и значительно расширить кодовую область.
Одновременно с этим, коды символов стали рассматриваться не как 16-битные значения, а как абстрактные числа.
Юникод расширили. На текущий момент, последняя версия 6.3.0 содержит 110 122 символа. Но, для перестраховки, стандарт был расширен сразу до 1 114 112 символов.

Кодовое пространство разбито на 17 плоскостей по 65536 символов.
Нулевая плоскость называется Базовой Многоязыковой Плоскостью (BMP), в ней расположены символы наиболее употребительных письменностей.
Первая плоскость используется, в основном, для исторических письменностей, вторая — для редко используемых иероглифов ККЯ, третья зарезервирована для архаичных китайских иероглифов.
Плоскости 15 и 16 выделены для частного употребления.
Вернемся к нашим char’ам.
Итого, двухбайтового типа char, специально придуманного для использования в java символов юникода, перестало хватать.
И вот, мы плавно подошли к такому понятию в Unicode, как «supplementary characters» — дополнительные символы и «surrogate pairs» — суррогатные пары.

Для совместимости со старыми 16-битными системами была изобретена система UTF-16, где первые 65 536 позиций,
за исключением позиций из интервала U+D800...U+DFFF, отображаются непосредственно как 16-битные числа, а остальные представляются в виде «суррогатных пар»
(первый элемент пары из области U+D800...U+DBFF, второй элемент пары из области U+DC00...U+DFFF).
Суррогатные пары введены для символов с кодами выше «U+FFFF» и которые, соответственно, не могут быть описаны в виде
отдельных 16-битных сущностей, таких как char (в java).
Для суррогатных пар была использована часть кодового пространства (2048 позиций), ранее отведённого для «символов для частного использования» в BMP.
Использование суррогатного механизма позволяет в UTF-16 поддерживать все 1 114 112 потенциальных символов Unicode.
UTF-16 использует 2 байта для любого символа в BMP, и 4 байта для дополнительных символов.

Ну это если кратко, то пока все.

P.S. Спасибо дочитавшим до конца.)

Иван, без обид, но лучше бы ты своим студентам объяснял чем Set от List отличается. И можно ли про Set утверждать что там нет дубликатов, если это интерфейс, который на реализацию ограничений не накладывает (да? нет? почему?).
Про кодировки интернам/джунам достаточно знать что они вообще разные есть.

Иван, без обид, но лучше бы ты своим студентам объяснял чем Set от List отличается.
Так я рассказываю! 4 лекции подряд по Collection API. Но те вопросы любой желающий найдет в любом посте «100 вопросов по Java Core».
Просто у меня появилось несколько занятных примеров по кодировкам, то, что прямо лежит в java.lang.String, но о чем многие не задумывались.

Плохо рассказываешь. И это не про коллекции вопрос, если его целиком прочитать. Если после курсов по кору люди не могут объяснить зачем нужны приватные методы и что плохого в имплементации Set, которая не проверяет дубликаты — то это не очень курсы.

Плохо рассказываешь.
На основании чего Вы сделали такой вывод? Вы ходили ко мне на курсы? Смотрели видео? Собеседовали выпускников?

Собеседовал выпускников конечно.

Кстати, мой брат из CreamTec вроде тоже собеседовал выпускников курсов. Говорил — слабоваты. Но я не уточнял, с какого уровня. Если с Java Core — то, наверное, да. С этого уровня знаний начинать выполнять практические задания все же рановато

Зависит еще от требований компании. Если компания ищет Java Junior на 800$ с требованием адекватного английского, представления о сетях, о базах данных, о верстке, JDBC/ServletAPI, JUnit, Spring. То користы на такую позицию очевидно слабоваты.
Если ищет Java Trainee на 300$, то это другой вопрос. После трех месяцев обучения при должном старании можно попасть.
Я бы не стал это сваливать в кучу такие разные требования и позиции.
Думаю, если бы у меня был год, то я мог бы эффективно (скажем 50% слушателей) подтягивать на типичного Java Junior за 800$. Но у меня нет этого года.

Какие требования, какой английский, жалуются же на то что твои выпускники не знают что такое private и Set, т.е. элементарщину!

у Ивана есть система дипломирования/сертификации по окончанию курса? В принципе любой человек может прийти прослушать курс, и говорить что прошел курсы у кого-то, или просто говорить, у них же подтверждений об этом не спрашивают...

Мне, честно говоря непонятно, почему тут все так на Головача накинулись?
Напишу свой скромный взгляд со стороны обучающегося (вернее самообучающегося).
Некоторое время назад совершенно случайно здесь же набрел на ссылку на его курсы, открыл первую попавшуюся видеозапись лекции (попалась по JUnit and Hamcrest ) и на следующий же день побежал заказывать и покупать в Розетке 2TB винчестер, чтобы пока его записи лекций выложенные им на youtube не начали исчезать их все успеть себе сохранить по курсам Core, Junior и Аддоны.
На сегодняшний момент самостоятельно, переписывая код с видео, прошел большую часть курса Core так что считаю, что какое-то мнение о курсе с точки зрения обучающегося высказать право имею.
Так вот — лично для меня(моего склада ума, психотипа и т.д.) Головач оказался просто божественным преподавателем (я таких за весь ВУЗ пару человек вспомнить могу только).
В чем его высокий уровень преподавательского мастерства выражается (опять же с моей точки зрения):
1. Он очень хорошо придумывает и подбирает абстракции при объяснении устройства JVM, работы компилятора, ООП и т.д.
2. Очень хорошо удерживается на уровне преподавания материала — его не заносит в дебри из которых потом некоторые преподаватели выбраться не могут и до конца лекции и т.д. — все идет четко, последовательно и по плану.
3. Его лабы составлены, как если помните в СССР книжки издавались типа «100 загадок и отгадок.», т.е. ответ на загадку (лабу) , если ты нашел правильный ответ — очевиден, что в принципе мне как «халявному слушателю» его курсов, не имеющему возможности послать его проверяющему на проверку является просто громадным плюсом. Т.е. если ты промучался над какой-то лабой пару дней, но ответ нашел — ты сразу понимаешь, что нашел правильный ответ.
4. Его лекции интересны и не вызывают желания заснуть — он приводит интересные примеры, показывает интересные фичи работы компилятора или JVM, под конец утомительных, высоконагруженных материалом лекций «юморит», чтобы слушатели могли на пару секунд расслабиться и потом опять в тонусе его дальше слушали.
5. В отличие от некоторых Российских курсов(не буду их называть), которые ориентированы на то, чтобы дать поверхностные знания и обмануть собеседующего (ну типа той хрени которая меня в ВУЗе раздражала больше всего: «Вы это учите, чтобы сдать экзамен.») у Головача, кроме кучи тестов и т.д. идет довольно глубокое преподавание материала. По каждой из тем, которые я прошел и все лабы выполнил лично для меня не составляет проблемы «копать вглубь», т.к. я понимаю как это работает и что мне объясняет автор, забурившийся в конкретные ньюансы данной темы в своем проекте. А не так — тему прошел, все тесты сдал, а потом открыл узкоспециализированную статью на хабре по этой теме и ничего не понял, т.к. учил тему, чтобы тесты сдать.
6. Честно рассказывает о том, как построены производственные отношения между программистом и работодателем с точки зрения наемного работника, о типах карьерного роста в аутсорсе и т.д. Нет, не с позиций «как поиметь работодателя, а лучше нескольких и сразу», а опять же четко, структурировано говорит о различных вариантах, подходах, стратегиях — короче перечисляет возможные пути роста, чтобы каждый мог выбрать тот, который подходит именно ему.

Да наверное можно много чего еще перечислить, но могу сказать одно — лично мне он совершенно бесплатно дал возможность изучить Java до уровня джуна по записям своих лекций, причем этот процесс скорее похож на «прокачку» в какой-нить MMORPG типа Aion, LA2, WOW — своим стилем преподавания он меня заставил «задротить левел в Java» если так можно выразится — изучение лекции за лекцией идет как получение уровней в игре — взял один, хочется быстрее взять следующий.

Не знаю, поможет ли мне его Core-курс попасть на декабрьские курсы GlobalLogic BaseCamp в Киеве или нет (т.к. курс его Java Junior, я боюсь, что только начну осваивать к началу конкурса на эти курсы) — если пройду конкурс, то обязательно отпишусь, но посоветовать его Курсы то ли в виде самоизучения (если у вас мозги потянут и усидчивости хватит часами самостоятельно их осваивать) то ли записаться к нему на заочные или очные(если Вы из Харькова) если Вам нужно живое общение с преподавателем я бы посоветовал.
По крайней мере — скачайте его первые пару лекций и посмотрите, уверен, что у большинства новичков в Java из тех кому программирование хоть как-то интересно как процесс, а не для того, чтобы «бабла срубить по-быстрому» возникнет желание в той или иной форме.

Вобщем-то этим длинным постом я хотел бы как-то отблагодарить Ивана Головача за то, что фактически благодаря ему я имею возможность с удовольствием освоить Java и надеюсь, что хотя-бы один человек, прочитав этот отзыв посмотрит своими глазами записи его лекций и запишется к нему на курсы.

Головач, перелогинься, не надоело нонэйм акаунты на форуме плодить?

Ну для этого ему пришлось бы в Киев приехать, т.к. у меня IP Киевского провайдера FreeNet (это легко проверить), а при всем желании в связи с текущими политическими событиями из Харькова в Киев ради того, чтобы твинко-акк наплодить ехать как-минимум глупо, а прокси или vpn-сервиса у FreeNet-а нет, насколько я знаю.

И как именно я могу проверить твой АйПи?
И скажи мне вот что, ты много месяцев мониторил ДОУ, ничего не писал, и тут внезапно как только появился топик про курсы зарегался и написал в него? И такие люди совершенно случайно появляются в большинстве из многочисленных рекламных топиков головача?

ты должен «вычислить» его по айпи, сейчас каждый школьник так умеет)))

Большинство людей не просиживают годами штаны на ДОУ, как это делаешь ты:)

НУ да, большинбство в вконтактиках и фейсбучеках сидят, котиков смотрят, я на специализированном форуме для программистов

Блин, я из Харькова, по Вашим характеристикам подпадаю под аффтара этой ветки обсуждения. И подпишусь под каждым его словом.
Если у Вас есть предложение, как я могу Вам доказать, что я — не Иван, предлагайте :)
Использую видео курсов для систематизации своих знаний в жаве. Потому что после накидывания на практические задачи какие-то знания появились, но... Не все делаю «правильно».
Так что — хочу присоединиться к говорящим «спасибо» Ивану за его работу.
ПС: деньги на курсы есть, времени нет :(

Я «juniora» смотрю с удовольствием, «java core» смотрел — в целом и так знал но несколько интересных вещей (для себя) высмотрел.

ps: я не клон.

Ну если не клон, значит будешь контрольной выборкой. Отпишись пожалуйста, сможешь ли ты через 3 месяца устроиться на джуниор джава девелопера. Если не отпишешься, значит тебе стыдно и ничего не получилось ))

У меня на ближайшее время не было планов менять работу, хотя желание все таки програмить на джаве имеется. И я не совсем контрольная выборка — у меня начальный уровень не нулевой :)

Ну тогда твое мнение вообще офтопик, головач же тут свои курсы по не совсем законному отниманию 500 или сколько там баксов у безобидных домохозяек толкает.

Я и не утверждал что у меня нулевой уровень.

Давай меня засчитаем за домохозяйку. Обещаю отписаться когда на работу устроюсь. ))

Вообще-то пойдет когда я закончу курсы, я ж даже не ищу сейчас работу.

Ну начинается. Ок, какой твой срок?

Объективно — надеюсь до конца весны устроиться куда-то.

Не понял, зачем тебе пол года? Головач же утверждает что ожидаемая зарплата после курсов Java Core — 200-400 баксов на позиции junior developer?

Трейни. Для джуна надо знать больше.

и что же джуну надо знать с твоей точки зрения ? тут топик где то был из солидным списком ...

я хотел бы как-то отблагодарить Ивана Головача за то, что фактически благодаря ему я имею возможность с удовольствием освоить Java

ты это.... проставься хоть потом Ивану, когда на работу возьмут

Признайся, гений, тебе заплатили?

З.Ы. Открою тайну выучиться на Java джуна, можно и без просмотра видео, сего ВСЕМИЛЮБИМОГО «персонажа». Может быть эти видео послужили просто как «органайзер» твоего времени и план (хотя я незнаю чем содержание книги хуже)

Даже тот же Java Rush за 200$ обучит намного лучше чем «Герой современного ИТ образования, ударник интелектуального труда»

Ну а тебе походу заплатил реалити хакер, или ты его свеженький бот.

И чем же Java Rush лучше?

да он мне заплатил.

я не буду пиарить здесь Java Rush.

Ты меня спалил, вторую часть суммы не получишь

Очередная «Теория заговора»? То Головач по их мнению, создает твинков и сам себя хвалит в своих постах, то платит деньги, чтобы ему позитивные отзывы писали — самим-то не смешно?
Я высказал свое мнение о курсе со стороны обучающегося, сказав, что лично для меня его курс оказался самым удобным, плюс он его фактически в полном объеме в сеть выложил — учись кто хочет и когда хочет, куски кода он из видео не выпиливал — все представлено в полной объеме.
Вот и хочу понять, почему его так не любят — в карман ни к кому не лезет, пашет как вол на курсах — я его некоторые лекции по 2 дня смотрю, т.к. объем информации в рамках одной лекции подается настолько большой, что иногда приходится «переваривать» его по-частям — т.е. в том, что он халтурно преподает Головача тоже обвинить нельзя, в чем проблема-то?

1. На ДОУ отсутствует возможность минусовать.
2. Редакция ДОУ не стремится сделать технический ресурс, а только «за жизнь».
Это приводит к тому, что концентрация неконструктивных критикантов — зашкаливает, а конструктивным проще сразу писать на HabraHabr.
P.S. Я считаю позицию редакции ДОУ — совершенно адекватной с рыночной точки зрения. Реклама + монетизация с помощью Джинн. Такая вот сегментация рынка.

Ну тебя то на хабре сразу бы за такие топики забанили за твои спам топики, или уже забанили? Почему ты не пишешь туда?

Вот план лекций JavaRush.
Как я понимаю:
1. Курс еще целиком не написан и существует только 2/3.
2. JavaRush — это механизм проверки знаний на основе игры. Он НЕ ПРЕДОСТАВЛЯЕТ МАТЕРИАЛА. Ни видео, ни статей. Мы делаем совершенно разные вещи. Я И читаю лекции И проверяю материал. JavaRush — ТОЛЬКО проверяет материал.

JavaRush предоставляет материал и свой и ссылки на более широкие описания)
Да, он не готов на 100% (по-моему только 20 из 80 уровней, но 20 уровней охватывают Java Core столько же сколько Thinking In Java) + стал платным (что не радует). Но когда он был бесплатным много людей его протестировало и всем нравилось всё, кроме мультиков футурамы...

Да и кажется, когда он стал платным лучшим «проходимцам» или падаванам которые проходят курс они будут предлагать собеседования и пробовать как то трудоустраивать, но это уже другая история...

З.Ы. Вот даже ссылку нашел info.javarush.ru/...page/probation

Да, вы правы насчет организации своего времени. Очень трудно время выкроить, если, например, я работаю (перешла на фриланс из-за курсов), подтягиваю английский, ну и семья еще есть. Лекции вечером, днем практика.

Самообразование — да, классно, да необходимо. Но если тебе кто-то подскажет хотя бы что и в какой последовательности учить, то потом будет меньше пробелов. И еще плюс таких курсов — можешь задавать свои глупые вопросы новичка специалисту и получить подробные ответы и советы. Опять же — проверка практических заданий, тоже неплохо.

Вы бы лучше кстати спрашивали что такое селективность.
А то понабирают вредителей, а потом бегают и орут «сервера упали».

селективность.
Что Вы имеете в виду?

Он имеет ввиду селективность значений в колонке таблицы БД, показывает степень уникальноси значение и следовательно хороший критерий для оценки индекса по этому значению.

В теории у архитектора не должно быть вопросов на эту тему, а наоборот — лекция и может не одна :)

1. Вы привели один термин, я попросил его уточнить, что Вы под ним имеете в виду. Это нормальный способ ведения дискуссии — уточнить, что имел в виду оппонент.
2.

Вы бы лучше кстати спрашивали что такое селективность.
Вы действительно полагаете, что на курсах для начинающих по Java просто необходимо объяснять вопросы проектирования RDBMS?

Тема:
Java Core собеседование: кодировки

А про селективность — мы здесь не электронику или химию обсуждаем. Какие варианты у Вас были что потребовалось уточнение?

ps. OpenJDK 7.0 default parameter:
-Dfile.encoding=UTF-8

Деякі питання не дуже коректні, бо з кастомними налаштуваннями JVM вивід на консоль буде іншим, ніж у Вас.
Для чого такі питання?

О каком именно примере вы говорите? Я везде явно указываю кодировку и не использую по-умолчанию. Она бы всплыла используй я явно
Charset.defaultCharset()
или косвенно
“Hello”.getBytes()
Encodes this String into a sequence of bytes using the platform’s default charset, storing the result into a new byte array.


char ch0 = 55378;
char ch1 = 56816;
String str = new String(new char[]{ch0, ch1});
    /**
     * Allocates a new {@code String} so that it represents the sequence of
     * characters currently contained in the character array argument. The
     * contents of the character array are copied; subsequent modification of
     * the character array does not affect the newly created string.
     *
     * @param  value
     *         The initial value of the string
     */
    public String(char value[]) {
        int size = value.length;
        this.offset = 0;
        this.count = size;
        this.value = Arrays.copyOf(value, size);
    }
Происходит просто копирование char[] во внутренний char[]. Кодировка по умолчанию не используется.

Собственно, java.lang.String предполагает, что в char[] данные всегда хранятся в UTF-16:

/**
...
 * <p>A <code>String</code> represents a string in the UTF-16 format
 * in which <em>supplementary characters</em> are represented by <em>surrogate
 * pairs</em> 
...
 */
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
...
}
Изменить этого нельзя.

консоль тоже имеет настройки кодировки.
ИМО лучше в текстовичек писать.

Тут согласен.
Я привел не «академические примеры» (выверенные и абсолютно корректные в любом окружении), а просты демонстрации некоторого поведения, которые могут натолкнуть на желание разобраться и копнуть глубже.

Ну и зачем спрашивать такое на собеседовании? Знание ответов на эти вопросы 99.99% НИКОГДА не понадобятся.

Даже порядок байтов (LE, BE) не понадобится? А я, вот, сталкивался. Тем более это актуально сейчас, когда миры Intel и ARM соприкасаются всё чаще: лучше сразу знать, что будет, если обмениваться, к примеру, не XML, а бинарными данными.

Порядок байтов, IEEE 745 и прочая изучается по мере необходимости.

Если надо бинарными — protobuf.

Так то оно так, но можно тогда вообще взять человека на работу сразу после школы, а всё что надо — он по мере необходимости нагуглит :-)

Того который не может гуглить — точно брать на работу не стоит :)

Не согласен с оценкой в 99.99%. Но согласен, что знание не типичное. Однако такие вопросы проверяют глубину и ширину знаний собеседуемого и его дотошность в изучении материала. Если человек после 5 лет в институте об этом даже не слышал — грош ему цена.

Бред! Вопросы о кодировках для джунов никогда не задаются. А ответы на такие вопросы не показывают ни дотошность, ни ум, ни смекалку они вообще ничего не показывают.

А как отсеять в такой ситуации:
— есть позиция Java Trainee на 300$ (я же говорил о Java Core — без сервлетов, спринга и ждбс)
— на нее пришло 10 кандидатов и 5 из них знают про String, ArrayList и RuntimeException.
Как выбрать одного? Часто берут того, у кого кругозор шире, эрудиции больше, склонного докапываться до деталей и т.д.

Вот есть прогрессивные конторы, например Гугл, фейсбук, амазон, МС, они тоже себя хотят оградить от десятков тысяч индусов, результатов выпуска аналогичных индуских курсов, и вот они почему то про кодировки не спрашивают . Подумай об этом.

Google признала, что головоломки на собеседованиях бесполезны
habrahabr.ru/post/184008

От головоломок про канализационные люки они да, отказались, а от алгоритмических вопросов на кодирование и системный дизайн — нет

Опять же зависит — кого Вы ищете.
Разраба LOB приложений — это одно.
Разраба ядра БД — другое.

И учтите, что сейчас спрос таков, что кривляться при поиске работника очень недёшево.

ИМХО, набрать кучу попугаев после трехмесячных курсов — в результате окажется много дороже чем переплатить за пару толковых спецов

Зависит от задач, жадности начальства и клиента, вопщем depends on...

Не от чего не зависит. Если задача — просрать бюджет, то тогда да, имеет смысл набирать попугаев, иначе человек должен обладать способностями к кодированию и дизайну

А бизнес хотить WSF (Worldwide Software Factory) и УЧЧ (универсальный человеко-час ). Все ети «лидеры» рынка толкают C# девелоперов как рубироидов, сеньоров как техлидов (зарплата та же). Они мечтают о толпах попугаев и умудряются все ето толкать клиенту.

Да, только клиент не в курсе что ему толкают попугаев.

Google и Facebook собеседуют по Java Core?
Если Вы приведете всем на обозрение примеры вопросов по Java Core с их собеседований — думаю серьезно поможете изучающим Java.

Думаю не собеседуют по java core. Причина вполне ясна, java core выучить для толкового человека не проблема, а вот что бы хорошо программировать и дизайнить нужно намного больше таланта, способностей и базы, их и проверяют.

И ваш критерий (встретится/не встретится) — не очень хорош.
Согласно ему также не надо спрашивать
— какие сортировки Вы знаете? — должен использовать только стандартную из JDK.
— Как устроен ArrayList/LinkedList? — никто в жизни не нагружает листы так сильно (сотни тысяч элементов) что бы заметить разницу.
— как реализовывать hashCode()? — IDE автогенерирует сама.
и т.д.

Зависит от того, кого Вы ищете. GUI ковырять — это не нужно особо.

Ээээ, те никто никогда не будеть ходить за данными в кривое апи, которое, якобы, отдает данные в утф8, которые на самом деле цп1251, сохраненные в бд с латин1?

getBytes("UTF-16″)

Лучше бы кто объяснил, _зачем_ там автодобавление BOM. Это ж его потом явно срезать.

UPD:
Использование latin1, как заметил Mike Gorchak приводит к некорректному результату, лучше взять cp1251.

Предполагаю, что следующую статью кто-то посвятит русскому языку.

Если UTF-8 так хорош (как все говорят), почему он занимает так много места (и чем он тогда хорош)?
UTF-8 хорош тем, что latin1 не содержит букв «ЭЮЯ». Это иллюзия вашего unicode IDE, что вы пишете там эти символы. thefonts.com/...ifs/Latin1S.gif
А что такое этот самый «UTF», если «их» так много?
www.unicode.org/.../ch03.pdf#G7404

Да, Вы правы, а я не прав.
Но дело тут не в IDE, а просто в моей невнимательности. Глянул, что latin1 поддерживает восточноевропейские символы, но не обратил внимание на то, что не поддерживает русский. Так что данные просто теряются:

import java.util.Arrays;

public class App {
    public static void main(String[] args) throws Exception {
        byte[] bytes = "ЭЮЯ".getBytes("latin1");
        System.out.println(bytes.length);
        System.out.println(Arrays.toString(bytes));
        System.out.println((char) bytes[0] + ", " + (char) bytes[1] + ", " + (char) bytes[2]);
    }
}

>> 3
>> [63, 63, 63]
>> ?, ?, ?

так что, пожалуй, корректно будет с cp1251 (правда непонятно стоит ли она стандартно в JDK для Linux).

что latin1 поддерживает восточноевропейские символы
О, проффесор во всей красе, какие именно восточноевропейские символы оно поддерживает? ))

Да, я ошибся.

да, «Курсы ГОЛОВАЧА» очень подходящее название для ИТ курсов, молодец, так держать!) Да и домен гениальный golovachcourses.com. Пытаетесь кому-то что-то доказать, тыкая свою фамилию в каждую «дырку»?)

Как известно бренд должен вызывать чувства. Все равно какие. Ваше раздражение говорит о том, что моя идея сработала.
Вы будете хаять и смеяться на каждом углу, но ВЫ БУДЕТЕ ГОВОРИТЬ О МОЕМ ДОМЕНЕ:)
Смотрите, как все просто. Вам кажется, будто вы все ближе к победе с каждым едким комментарием, а с моей точки зрения — вы меня просто бесплатно рекламируете.

Вообще-то «ребрендинг» связан со следующими факторами:
1. Тяжело выйти на рынки Москвы/Питера с таким «местечковым» названием как Kharkov IT Courses.
2. Название должно автоматически запоминаться. Курсы Алмаз, Протон, Трамплин, ШАГ — надо очень долго сообщать аудитории, что бы вас запомнили.
3. Благодаря reality_hacker название само стабилизировалось на «Курсы Головача».
4. Почему это Хану можно иметь свою Академию Хана, а мне нельзя — Курсы Головача?:)

Да, отдельно спасибо reality_hacker.
Благодаря Вам информированность сообщества о моих курсах растет как на дрожжах:)
И особенно спасибо за целый топик, который вы создали (но который был удален администрацией). Тогда многие заинтересовались и посмотрели мое видео.

Признайтесь уже, он у вас на ставке?

Думаю, при любых обстоятельствах я бы не стал работать с сотрудником с такими человеческими качествами.

Ты прав, у тебя денежек не хватит что бы оплатить неудобства твоих человеческих качеств.

кодировки — это то на что джава джун может забить до тех пор пока не выучит всё остальное.

+1
Не понимаю каким образом изучение отличий между UTF-8, 16 и 32 должно «подтолкнуть кого-то к более детальному изучению языка и стандартной библиотеки». И что за «стандартная библиотека» вообще — rt.jar? В Java это называется Foundation Classes.

Я не считаю, что человек обязан детально знать алгоритм UTF-8, хотя мы на лабораторной и пишем UTF-8 кодер/декодер. Однако человек должен четко понимать что такое кодировки и, скажем, знание того, что UTF-8 — variable length скажет ему, что он не может найти конкретный i-ый символ в UTF-8 файле без перебора с начала файла.
Т.е. RandonAccessFile (произвольный доступ) по сути не даст преимуществ перед FileInputStream (последовательный доступ).

И в каком месте здесь «более детальное изучение языка и стандартной библиотеки»?

человек должен четко понимать что такое кодировки
Вы имеете в виду именно variable length кодировки.

С детства все знают чем cp1251 отличается от KOI-8 — но по вашему выходит что люди, привычные к 8-битным кодировкам не знают что такое кодировки.

Забавные бредни.

Полагаю, Вы не совсем понимаете проблематику образования. Учиться приходят люди, которые не знают с детства чем отличаются cp1251 и KOI-8.

Из ваших курсов они этого, похоже, и не узнают.
Вопрос лично вам как эксперту по «кодировкам» — вы много знаете variable-width кодировок помимо тех что в Unicode? С сколькими вы сталкивались в реальных проектах?

1. Многие html/xml используют UTF-8.
2. UTF-8 — variable width.
Разве этого недостаточно, что бы ожидать, что человек должен понимать, что такое кодировка с переменной длиной?

С Unicode все понятно — это актуальная тема, с этим никто не спорит. Но Unicode это отдельная тема сама по себе, это не «кодировки» в целом.
(И чтоб вы знали — UTF-16 тоже variable width — только UTF-32 fixed width).

Но вне этой темы, сколько variable width кодировок вы знаете? Назовите число.

А с какой целью Вы интересуетесь?
Это же DOU, все что я напишу — будет использовано против меня:)

К тому чтоб вы понимали, что variable width кодировки встречаются крайне редко — не считая Unicode. Но Unicode это отдельная обширная тема, поэтому когда говорят «кодировки» конкретно Unicode не подразумевается.

В этом — согласен. Однако кодирование с переменной шириной часто используется в «алгоритмических» места. Скажем надо бойцу хранить много long. Если он понимает, что необязательно тратить точно 8 байт, а можно первым байтом написать тип следующих данных (0-byte,1-short,2-int,3-long) а потом хранить число, округленное до минимального (byte/short/int/long), которое еще не теряет значащие разряды.
Иначе боец всегда будет требовать под long — 8 байт не понимая, что есть другие варианты.
.
Это всплывает, скажем, при определении своего формата сериализации (Serializable/Externalizable).

Заводить целый лишний байт ради 2 бит это расточительно. Хранить разные типы прийдется в какой-то коллекции, накладные расходы на которую полностью нивелируют выигрыш по памяти. Массив из n long займет 8*n байт. А связный список = размер значения (пусть int) 4 байта + указатель на него (в 64-битных системах уже 8 байт, в 32-разрядных еще 4) + указатели на следующиий и предыдущий. В чем экономия?

У вас есть миллион лонгов, это id выданные базой, пока они в диапазоне 0-10М (задел на будущее, потому взяли long а не int). Вы хотите их сериализовать в бинарный формат и послать по сети. Никаких структур со ссылками.

Мысль интересная, сейчас попробую.

Начальный эксперимент

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Random;

public class App0 {
    public static void main(String[] args) throws IOException {
        Random rnd = new Random(0);
        ByteArrayOutputStream buff = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(buff);
        for (int k = 0; k < 1_000_000; k++) {
            out.writeLong(rnd.nextInt(10_000_000));
        }
        out.flush();
        out.close();
        System.out.println(buff.toByteArray().length);
    }
}

>> 8 000 000

GZIP:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.zip.GZIPOutputStream;

public class App1 {
    public static void main(String[] args) throws IOException {
        Random rnd = new Random(0);
        ByteArrayOutputStream buff = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(new GZIPOutputStream(buff));
        for (int k = 0; k < 1_000_000; k++) {
            out.writeLong(rnd.nextInt(10_000_000));
        }
        out.flush();
        out.close();
        System.out.println(buff.toByteArray().length);
    }
}

>> 3 921 956

Custom:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import java.util.zip.GZIPOutputStream;

public class App2 {
    public static void main(String[] args) throws IOException {
        Random rnd = new Random(0);
        ByteArrayOutputStream buff = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(new GZIPOutputStream(buff));
        for (int k = 0; k < 1_000_000; k++) {
            int val = rnd.nextInt(10_000_000);
            if (val <= 0xFF) {
                out.writeByte(1); out.writeByte(val);
            } else if (val <= 0xFFFF) {
                out.writeByte(2); out.writeShort(val);
            } else if (val <= 0xFFFFFF) {
                out.write(3);
                out.writeByte(val);
                out.writeByte(val >>> 8); 
                out.writeByte(val >>> 16);
            } else if (val <= 0xFFFFFFFF) {
                out.write(4);out.writeInt(val);
            } else {
                out.write(8);out.writeLong(val);
            }
        }
        out.flush();out.close();
        System.out.println(buff.toByteArray().length);
    }
}

>> 3 394 949

Отлично — результаты сравнимы с gzip, но то, что на входе/выходе gzip можно напрямую маппить в/из памяти. Думаю я предпочел бы gzip.

Вообще говоря не ожидал, что на таких данных GZIP так неплохо справится. Видимо хорошо уловил, что в каждых 8 байтах — 5 старших это 0.

Спасибо Хаффману за это (-;

Думаю GZIP начнет проигрывать на данных с переменной длиной. Скажем жмем 1М ява-бинов с полями разных типов — int/long/String/byte[].

Вы таки сомневаетесь в алгоритме Хаффмана? Ну дерзайте, проверяйте.

Отлично — результаты сравнимы с gzip, но то, что на входе/выходе gzip можно напрямую маппить в/из памяти. Думаю я предпочел бы gzip.
И правильно сделал, код проффесора здесь показал хорошие результаты, потому что на вход подавался белый шум, если бы было что-то другое, например монотонная последовательность айдишников, гзип скорее всего зарулил бы

если флаги 4 лонг паковать в один байт (по 2 бита на лонг), то 1М лонгов займет < 3 250 000.

Максимальный уровень компрессии (скорость сильно просела):

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;

public class App1x {
    public static void main(String[] args) throws IOException {
        Random rnd = new Random(0);
        ByteArrayOutputStream buff = new ByteArrayOutputStream();
        // best: 3887674
        DataOutputStream out = new DataOutputStream(new DeflaterOutputStream(
                buff, new Deflater(Deflater.BEST_COMPRESSION, true),
                512, false));
        for (int k = 0; k < 1_000_000; k++) {
            out.writeLong(rnd.nextInt(10_000_000));
        }
        out.flush();
        out.close();
        System.out.println(buff.toByteArray().length);
    }
}

>> 3 887 674

Как понимаю, одна из причин (только одна из списка) существования зоопарка бинарных маршалеров в яве (Protobuff, thrift, Hessian, avro, ...) - некомпактность стандартной сериализации в Яве.
Некомпактность в этом контексте — это проблема.

существования зоопарка бинарных маршалеров в яве
Лол, ты даже не в курсе что все что ты перечислил это не явовские маршаллеры, а кроссплатформенные маршаллеры, т.е. решают проблемы межплатформенного взаимодействия
Проффесор, блещи эрудицией дальше!

профессор который только и трясется как бы не сболтнуть лишнего, а то «о боженьки, я ведь глупым покажусь, а я же огого! профессор ведь» — тоже не самый лучший вариант
да, может быть человек ошибся, теперь будет знать

Меня всегда поражает, что заставляет людей умничать в том, в чем они не рубят? Зачем это?

Эти маршаллеры в том числе кросплатформенные. Но в типичной ситуации связывают вызовы в гомогенной среде.

Лол, они в первую очередь кроссплатформенные, протобуферы сделали для взаимодействия в гетерогенной среде гугла, шрифт — тоже самое у фейсбука, у шрифта вообще sdk на C++ написан. Про «типичную ситуацию» это тоже твои досужие фантазии.

А зачем список, да еще связанный. Простая последовательность «код числа, значение». А если кодов только четыре (0-byte,1-short,2-int,3-long) то их можно закодировать в одном байте (по два бита на число). Итого, читаем первый байт — в нем описаны типы четырех последующих чисел, в соответствии с типами читаем нужное кол-во байт. Ну, как-то так.

С детства все знают чем cp1251 отличается от KOI-8

Я подозреваю, что те, кто родился этак после 90-го года, в массе таких вещей уже не знают — неоткуда узнать. Это всё-таки мир победившего юникода.

С другой стороны, не уверен, что понятие 8-битных кодировок им пригодится в реальной практике, если это не будут явно системные программисты или архитекторы сетевых форматов и протоколов.

скажем, знание того, что UTF-8 — variable length скажет ему, что он не может найти конкретный i-ый символ в UTF-8 файле без перебора с начала файла.

Уточните, пожалуйста, вы случайно или намеренно смешали понятия character и codepoint? jIMHO, это смешение недопустимо.

В конструктивных целях — лучше назовите аналог библиотеки ICU для Java, если он существует, и его основные свойства и методы применения.

Интересно, а что такое «все остальное»?
Что должен знать человек по Java Core, что бы его взяли на 300$-400$?
switch/while — явно недостаточно.

swith/while — явно недостаточно.
Учитывая то, что вы switch не можете написать правильно, вас бы не взяли, да.

Попробуем посерьезнее.
Как насчет основ ООП в Java (классы, абстрактные классы, интерфейсы, видимость полей и методов, оверайдинг/оверлоадинг, и т.д.)? Стандартные коллекции? Понимание принципов работы garbage collector-а, memory leak-и в Java, finalize() метод (ваши студенты знает о нем, надеюсь)? Работа со строками, файлами, датами? Работа с исключениями (exceptions)? Основы работы с потоками (Thread/Runnable, киворд synchronized)?

А так то switch/while есть и в Паскале.

В моем курсе
— 

Как насчет основ ООП в Java (классы, абстрактные классы, интерфейсы, видимость полей и методов, оверайдинг/оверлоадинг, и т.д.)?
— 4 лекции (12 часов)
Стандартные коллекции?
— 4 лекции (12 часов)
Понимание принципов работы garbage collector-а, memory leak-и в Java, finalize() метод (ваши студенты знает о нем, надеюсь)?
— 1 лекция (3 часа)
Работа с исключениями (exceptions)?
— 4 лекции (12 часов)
Основы работы с потоками (Thread/Runnable, киворд synchronized)?
— - 4 лекции (12 часов)
...
И в рамках Java I/O — 4 лекции по 3 часа я посвящаю 1 лекцию (3 часа) кодировкам.

А Spring, Hibernate, основы JavaEE не читаешь своим слушателям? Или ты считаешь что на Java Core далеко уедешь?

Читаю.
У меня есть 3 типа групп (каждая по 3 месяца):
— Java для начинающих: для тех, кто не имеет профильного образование. Занятия с ноутами, в группе 6-8 человек
— Java Core: исключения, потоки, коллекции, ООП, Java I/O
— Junior Java Developer: View (http, Servlet API, JSP, Spring MVC (intro)), Model (Spring, TDD(JUnit, Mockito), Log4j, Maven), Data (JDBC, JPA/Hibernate(intro))
.
Думаю, слушателям удобно несколько коротких курсов. Можно выбрать только один, идти подряд или несколько одновременно (иногда Core + Junior = это 4 лекции по 3 часа в неделю).

Hibernate(intro)
Онли по верхам? Или насколько глубоко погружение в хибернейт?

JDBC — 6 лекций.
Hibernate/JPA2 — 2 лекции.
Хорошо понимая подноготную (DAO pattern, JDBC API, connection pool, transaction boundaries, transaction isolation levels, получение метаданных с помощью JDBC, OpenSessionInView pattern, ...) достаточно просто самому получить дополнительные знания по Hibernate/JPA2.

Вы практически дословно привели программу моего курса:)

Та Java Core его студенты знают на зубок, правда на этом их знания заканчиваются. Это достаточно чтобы посупить на intern’а, но недостаточно на джуна.

Спасибо:)
Собеседовали?

Было дело и не раз. Плюс, есть знакомые которые посещают ваши курсы.

p.s. Яну Гулому привет передайте, а еще пенделя отвесьте чтобы не расслаблялся.

Что опять никто на курсы не идет и будешь 100500 топиков поднимать?

В моей текущей Java Core группе — 35 студентов.

НУ текущие повевшиеся не означают поток в будущем, особенно с твоим качеством результата.

А что там хоть с качеством? Какой-то очередной срач я прощелкал?

Ну ты же в харькове, можеш поприглашать, пособеседовать, и даже на работу взять посмотреть родит ли хоть что-то хоть кто нибудь на джаве ))

я не пишу на java и не знаю ее. А ты уже собеседовал выпускников Головача?

Нет, я не собеседовал выпускников Головача

а что вы можете сказать о качестве выпускников Головача и на основе какого опыта?

По многим косвенным признакам, например перегруженая программа, которую начинающий вряд ли воспримет, которая собственно программированию и не учит, профанство Головача во многих вопросах, пересекающееся с охеренным самомнением и заканчивающиеся забавными фейлами, головач сам как то озвучивал крайне неутешительные цифры трудоустройства выпускников, ну и они мне сами в последнее время повадились писать, как главному опоненту головача на форуме, приходится общатцо..

Тебе пишут неудовлетворенные студенты Головача? Что они рассказывают/просят?

Ну они же наверное ожидают конфиденциальности от нашей дискуссии ))

«мне много пишут, но о чем — секрет» :)

Тебя это беспокоит и теперь не дает спать?

есть хорошие цифры по трудоустройству выпускников других курсов/вузов?

А что эти цифры доказали бы? Украинские вузы известны качеством образования?

Эти цифры дали бы возможность проводить сравнение. Я думаю подавляющее меньшинство украинских студентов имеют возможность/желание получить образование в топ-100 тех. вузов мира. Мне кажется мы можем адекватно сравнивать курсы Головача только с украинским образованием. Ты предлагаешь сравнивать Головача с MIT, Berkley, KTH и МГУ?

А что закончил ты?

Мне кажется сравнивать трехмесячные курсы с институтской программой — это полный маразм. Еще мне кажется что головач как раз эксплуатирует уже заложенную базу в институте, или может известен какой нибудь случай джава программиста сделанной головачем из кухарки?

Пару недель назад Global Logic устраивал открытый конкурс на весь Харьков (1.500.000 населения) на Java Trainee, так вот из 12 мест мои слушатели заняли 5.
Конкурс был 170 человек на 12 мест.
Я полагаю, это позволяет мне смело утверждать, что у меня лучшие курсы по Java в городе судя по результату.
И учтите, что У МЕНЯ НЕТ ВХОДНОГО ОТСЕВА.

Это если ваших было 5 и все прошли то лучшие курсы, а если ваших было 163 и прошло всего 5 то это ппц. ;-)

1. Я так понимаю, что Вы не всерьез предполагаете что на открытом конкурсе в миллионном городе я смог забить 98% канала своими выпускниками? :) Я думаю, это могла бы сделать Академия ШАГ (со своими 14.000 слушателей), но не делает.
2. Это пример только одного конкурса в одну компанию. Мои выпускники также работают в GridDynamics, NixSolutions, EPAM.

Підписатись на коментарі