Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtPmStUn 55 of 412 menu
◀ ▶

Юникод в Dart

Буквам всех языков дают единые номера. Общий список таких номеров называется Юникодом (Unicode, единые номера букв для всех языков). У каждой буквы свой номер, один и тот же в разных программах.

Номер еще нужно разложить по байтам. Две обычные формы так и называются: UTF-8 и UTF-16.

В UTF-8 английская буква и цифра занимают 1 байт. Русская буква занимает 2 байта. Знак евро и иероглиф занимают по 3 байта.

В UTF-16 английская буква, русская буква, знак евро и иероглиф занимают по 2 байта, 16 бит. Редкий символ за пределами этого набора занимает 4 байта и в UTF-8, и в UTF-16. В примерах этого раздела такие символы не используем.

В Dart строка хранит текст в UTF-16. Английская и русская буквы внутри строки одинаковы по размеру: обе по 2 байта. Форму UTF-8 используют файлы и страницы в сети. На размер строки в программе она не влияет.

Свойство length считает не байты, а кодовые единицы UTF-16. Пять букв hello дают 5 единиц. Один смайл может занять 2 единицы, хотя на экране это один знак.

Пять букв hello - это 5 символов и 10 байт строки в Dart. Пять букв котик - тоже 5 символов и 10 байт строки, хотя в UTF-8 они занимают 10 байт против 5 у hello. Две цифры в записи "12" - это два символа и 4 байта строки.

Одни и те же тексты в двух формах занимают разное число байт:

Текст Символов Байт в UTF-8 Байт в UTF-16
a 1 1 2
я 1 2 2
cat 3 3 6
кот 3 6 6
hello 5 5 10
котик 5 10 10
字 1 3 2
文字 2 6 4
€ 1 3 2

Дана переменная:

var str = "hello";

Найдите число кодовых единиц UTF-16 в этой строке и выведите его.

Дана переменная:

var str = "a😀b";

Найдите число кодовых единиц UTF-16 в этой строке и выведите его.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить