DD
#include <stdio.h>
#include <wchar.h>
int main() {
wchar_t *str = L"приветhello";
printf("%d, %d\n", wcslen(str), sizeof(str));
return 0;
}
[tux@nb tmp]$ gcc ./test.c -o ./test && ./test
11, 8
Size: a a a
DD
DD
RK
>>> t1 = 'жыр'
>>> len(t1)
3
Здесь мы видим строку в переменной t1
, строка состоит из трёх русских букв, длина этой строки — 3. Это не три байта, это три символа! Юникодная строка (не только в питоне) — это по сути список юникодных символов, у каждого символа есть код в стандарте юникода. Для нашего примера коды символов можно посмотреть через функцию ord()
:>>> [ord(x) for x in t1]В таком виде юникодный текст может крутиться внутри программы, но если мы хотим его передать наружу в виде байтов, то должны его закодировать так, чтобы на другом конце смогли корректно раскодировать. Кодирование на английском — encode, декодирование — decode. Сейчас самый стандартный способ кодирования — utf8, если вы видите фразу типа «текст в кодировке utf8», то это означает, что перед нами список (массив) байтов, не букв языка, а именно байтов. Кодирование делается так:
[1078, 1099, 1088]
>>> u1 = t1.encode('utf8')Видим, что длина закодированного текста — шесть байтов. Как именно работает utf8, нам сейчас совершенно не интересно, главное, что после кодирования мы получаем байтовую строку, это по сути список чисел, каждое в диапазоне от 0 до 255 (этот тип называется
>>> len(u1)
6
bytes
). При этом юникодная строка — это на самом деле список чисел в диапазоне от 0 до 1114111, только в питоне эта кухня скрыта, но вы должны понимать это, когда делаете len(s)
на юникодной строке.u1
из примера выше такое:>>> u1Чтобы его преобразовать в юникод, его нужно декодировать (помним: кодируем в байты, декодируем из байтов), в аргументе передаём название кодировки:
b'\xd0\xb6\xd1\x8b\xd1\x80'
>>> u1.decode('utf8')Помним главное, фраза «текст в кодировке utf8» означает, что у нас «текст» представляет собой список байтов, это ещё не юникодный текст, юникодным он станет после декодирования из кодировки utf8. Юникодная строка никак не закодирована, это строка из уже готовых для использования символов. В наш просвещённый 21 век в любой программе пора уже использовать тексты исключительно в юникоде.
'жыр'
RK
RK
RK
MD
KW
RK
MD
RK
AT
KW
DD
DD
DD
KW
DD
KW
KW