Как mbstring понимает как считать кол-во символов?

Вот пример:
Bash:
$ echo -n Q > 1.txt
$ echo -n Щ > 2.txt
$ echo -n ≤ > 3.txt
$ echo -n QЩ≤ > 4.txt
$ xxd -b 1.txt
00000000: 01010001                                               Q
$ xxd -b 2.txt
00000000: 11010000 10101001                                      ..
$ xxd -b 3.txt
00000000: 11100010 10001001 10100100                             ...
$ xxd -b 4.txt
00000000: 01010001 11010000 10101001 11100010 10001001 10100100  Q.....
$ php -r 'echo mb_strlen("QЩ≤"), PHP_EOL;'
3
mb_strlen верно говорит, что в строке 3 символа. Но это я знаю, что их там три, потому что глазами вижу Q, Щ и ≤ и вообще сам их туда записал. Как оно глядя на этот набор байтов понимает всё это? Ну допустим считывает первый байт, видит там число меньше (или равно) 128 (01010001 == 81) и понимает: ага, это однобайтный символ Q - всё сходится (хотя почему 128? 2 в восьмой степени = 256). Идём дальше. Считываем 11010000 = 208. Допустим 208 попадает в интервал (128, какое-то число, по идее 2 в шестнадцатой (65536)) и тут мы понимаем, что это двухбайтный символ. Ну окей, считываем первый байт символа ≤ - это 11100010 или 226 в десятичной. Так он тоже попадает в тот же интервал, что и предыдущий символ. Очевидно, что я не понимаю, как это работает. Так как это работает? Как mbstring понимает, что вот один однобайтный символ, а за ним вот двухбайтный, за ним трёхбайтный и вся строка состоит из трёх символов?
 

AmdY

Пью пиво
Команда форума
Ох, если ещё человеки освоят поиск в гугле, без работы останемся
 
Сверху