Незаслуженно, по-моему, пропущена книжка Одерского по скале www.amazon.com/...p/dp/0981531644
А также полезный сайт с коанами: www.scalakoans.org
кодовые единицы это code units, их количество и возвращает метод length. А str.codePointCount(0, 2).
вернет количество кодовых точек (кодов юникода).
ну как возможность подвигать байты, то да, полезно )
насчет charset в java я не прав — там это тоже coded character set.
Я себе сделал такую шпаргалку:
Юникод — это стандарт кодирования символов для большинства языков мира, включая вымершие, а также много различных вспомогательных символов (например, математических). Юникод разрабатывает одноименный консорциум (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 последовательности). А если и получится, то значит вы убили кучу времени на изобретение велосипеда %)
[Харьков]
Сдам свою 2к.кв. на длительный срок. 1/5 без балкона, пр-т Героев Сталинграда 167, район Коммунального рынка.
В квартире сделан качественный капитальный ремонт, новая кухня и сантехника.
Ближайшее метро Дворец Спорта, 10 мин. на троллейбусе или 25 мин.пешком.
Цена 200 уе + счетчики (свет, вода, газ (варочный), интернет (если нужен)) p0t3S8j0cflOOCtOfm0a?dl=0
оплата за 1 и последний месяц
Фото:
www.dropbox.com/...
Телефон:096 683-89-36