2013-02-07 3 views
2

Можете ли вы объяснить, как эта строка кода эквивалентна следующему коду:

<?php 
$string = chr(($number >> 6) + 192).chr(($number & 63) + 128); 
?> 

Его эквивалентном:

if ($number >=128 && $number <=2047){ 

    $byte1 = 192 + (int)($number/64); //= 192 + ($number >> 6) 
    $byte2 = 128 + ($number % 64);  //= 128 + ($number & 63) 
    $utf = chr($byte1).chr($byte2); 
} 

, например, введя номер 1989 и производит ߅

Эти коды используются для преобразования объектов UNICODE обратно в исходные символы UTF-8.

+1

Посмотрите UTF -8 в Википедии.Они дают подробное описание того, как это работает. Этот код довольно прост, как только вы понимаете кодировку. – nneonneo

+0

вопрос в том, как (int) ($ number/64) =? ($ number >> 6) –

ответ

2

Код сверху использует двоичные операторы. >> является оператором смены. Он сдвигает бит в число вправо (в сторону более значительных бит).

Так 11110000 >> 2 = 00111100

Это эквивалентно делению по степеням 2 $number >> $n такое же, как $number/pow(2,$n).

& является «побитым» и «оператором». Он сравнивает соответствующие биты на обоих числах и устанавливает в результате те, которые равны 1 в обоих числах.

11110000 & 01010101 = 01010000

По and'ing $number 63 (001111111) вы получите остаток от деления $number на 64 (так называемый модуль), который написан $number % 64.

2

$number >> 6 двоичный сдвиг-вправо операции, а именно: 11000000 >> 6 == 00000011 эквивалентно $number/pow(2,6) ака $number/64

$number & 63 является бинарным AND с 00111111

И гораздо быстрее сделать в виде двоичных операций, поскольку они имеют дело с полномочиями или два.

0

Добавление к @ ответ MCHL причина для добавления 192 в последовательности UTF является сигналом о начале информации байт

192 - 11000000 - Начало 2 последовательности байт (128 + 64)

224 - 11100000 - Начало 3 последовательности байт (128 + 64 + 32)

240 - 11110000 - Начало 4 последовательности байт (128 + 64 + 32 + 16)

248 - 11111000 - Начало 5 последовательности байт (Restricted) (... + 8)

252 - 11111100 - начало 6 последовательности байт (Restricted) (... + 4)

254 - 11111110 - Invalid

Таблица Ссылка: https://en.wikipedia.org/w/index.php?title=UTF-8&oldid=388157043

UTF-8 byte range table