Юникод в 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 в этой строке и выведите его.