Юникод в C++
Одного байта не хватает для всех букв. Из-за этого буква может занимать больше одного байта.
Есть разные способы разложить буквы по байтам. Эти способы называются кодировками. Кодировок несколько. Давайте разберем две обычные.
Буквам всех языков дают единые номера. Общий список таких номеров называется Юникодом (Unicode, единые номера букв для всех языков). У каждой буквы свой номер, один и тот же в разных программах.
Номер еще нужно разложить по байтам. Две обычные формы так и называются: UTF-8 и UTF-16.
В UTF-8 английская буква и цифра занимают 1
байт. Русская буква занимает 2 байта.
Знак евро и иероглиф занимают по 3 байта.
В UTF-16 английская буква, русская буква, знак
евро и иероглиф занимают по 2 байта, 16 бит.
Редкий символ за пределами этого набора занимает
4 байта и в UTF-8, и в UTF-16. В примерах
этого раздела такие символы не используем.
Строка std::string хранит текст в UTF-8.
Английская буква внутри строки занимает 1
байт, русская - 2, иероглиф - 3.
Форму UTF-16 используют
другие языки. На размер строки в C++ она не влияет.
Пять букв hello - это 5 символов
и 5 байт строки. Пять букв котик -
тоже 5 символов, но уже 10 байт
строки. Две цифры в записи "12" - это
два символа и 2 байта строки.
Метод size возвращает это число байт.
У английского слова оно совпадает с числом
букв, у русского букв вдвое меньше, чем байт:
std::string str1 = "hello";
std::cout << str1.size() << "\n"; // выведет 5
std::string str2 = "котик";
std::cout << str2.size() << "\n"; // выведет 10
Одни и те же тексты в двух формах занимают разное число байт:
| Текст | Символов | Байт в 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
|
Сколько байт занимает русская буква в UTF-8?
Сколько байт занимает русская буква в UTF-16?
Сколько байт занимает иероглиф в UTF-8?
В слове котик пять букв. Сколько байт оно занимает в UTF-8?
Сколько байт занимает слово hello в UTF-16?
Сколько байт занимают иероглифы 文字 в UTF-8 и сколько в UTF-16?
Что вернет метод size для строки котик:
число букв или число байт? Какое это число?