systems administrator
  • Топик для объявлений Куплю/Продам/Отдам/Сдам/Сниму etc

    [Харьков]
    Сдам свою 2к.кв. на длительный срок. 1/5 без балкона, пр-т Героев Сталинграда 167, район Коммунального рынка.
    В квартире сделан качественный капитальный ремонт, новая кухня и сантехника.

    Ближайшее метро Дворец Спорта, 10 мин. на троллейбусе или 25 мин.пешком.

    Цена 200 уе + счетчики (свет, вода, газ (варочный), интернет (если нужен))
    оплата за 1 и последний месяц
    Фото:
    www.dropbox.com/...p0t3S8j0cflOOCtOfm0a?dl=0

    Телефон: 096 683-89-36

  • Scala дайджест #0

    Незаслуженно, по-моему, пропущена книжка Одерского по скале www.amazon.com/...p/dp/0981531644
    А также полезный сайт с коанами: www.scalakoans.org

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

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

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

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

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

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

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

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

    Юникод — это стандарт кодирования символов для большинства языков мира, включая вымершие, а также много различных вспомогательных символов (например, математических). Юникод разрабатывает одноименный консорциум (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 последовательности). А если и получится, то значит вы убили кучу времени на изобретение велосипеда %)

    Поддержал: Сергей Белевцов