Лучшее объяснение $ convmap в mb_encode_numericentity ()

Описание, данное этому параметру, convmapдля метода mb_encode_numericentity в Руководство по PHP смутно для меня. Может ли кто-нибудь помочь с более подробным объяснением этого или, может быть, «ошарашить», если этого будет достаточно для меня? В чем смысл элементов массива, используемых в этом параметре? Пример 1 в manpage имеет

<?php
$convmap = array (
int start_code1, int end_code1, int offset1, int mask1,
int start_code2, int end_code2, int offset2, int mask2,
........
int start_codeN, int end_codeN, int offsetN, int maskN );
// Specify Unicode value for start_codeN and end_codeN
// Add offsetN to value and take bit-wise 'AND' with maskN, then
// it converts value to numeric string reference.
?>

что полезно, но потом я вижу много примеров использования, таких как array(0x80, 0xffff, 0, 0xffff); что отталкивает меня Означает ли это, что смещение будет 0 и маска будет 0xffffЕсли да, смещает ли среднее число символов в строке, чтобы начать преобразование, и что mask значит в этом контексте?

4

Решение

Глядя вниз Кроличья нора, кажется, что комментарии в документации для mb_encode_numericentity точны, хотя и несколько загадочны.

Четыре основные части convmap оказаться:

start_code: Карта влияет на элементы, начиная с этого кода символа.
end_code: Карта влияет на предметы до этого кода символа.
offset: Добавление определенной суммы смещения (положительный или отрицательный) для этого кода символа.
mask: Значение, которое будет использоваться для операции маски (код символа побитовое И значение маски).

Коды символов можно визуализировать с помощью таблиц символов, таких как этот пример макета кодовой страницы за ISO-8859-1 кодирование. (ISO-8859-1 это кодировка, использованная в оригинальной документации PHP Пример № 2.) Глядя на эту таблицу кодирования, мы видим, что convmap предназначен только для воздействия на элементы кода символа, которые начинаются с 0x80 (которая, по-видимому, пуста для этой конкретной кодировки) до последнего символа в этой кодировке 0xff (который, кажется, ÿ).

Для того, чтобы лучше понять смещение а также маскировать особенности convmapВот несколько примеров того, как смещение и маска влияют на коды символов. (и в приведенных ниже примерах наши character code имеет определенное значение 162):

<?php
$original_str = "¢";
$convmap = array(0x00, 0xff, 0, 0xff);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n";
?>

Результат:

original:  ¢
converted: &#162;

<?php
$original_str = "¢";
$convmap = array(0x00, 0xff, 1, 0xff);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n";
?>

Результат:

original:  ¢
converted: &#163;

Заметки:

offset кажется, для более точного контроля текущего start_code а также end_code раздел предметов для конвертации. Например, у вас может быть какая-то конкретная причина, по которой вам нужно добавить смещение для определенной строки кодов символов в вашем convmap, но тогда вам может понадобиться игнорировать это смещение для другой строки в вашем convmap,


<?php
// Mask Example 1
$original_str = "¢";
$convmap = array(0x00, 0xff, 0, 0xf0);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n\n";

// Mask Example 2
$convmap = array(0x00, 0xff, 0, 0x0f);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n\n";

// Mask Example 3
$convmap = array(0x00, 0xff, 0, 0x00);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n";
?>

Результат:

original:  ¢
converted: &#160;

original:  ¢
converted: &#2;

original:  ¢
converted: &#0;

Заметки:

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

Маска Пример 1

Итак, в первом примере маски 0xf0, f указывает, что мы хотим сохранить значения в левой части двоичного значения. Вот, f имеет двоичное значение 1111 а также 0 имеет двоичное значение 0000— в совокупности становится ценностью 11110000,

Затем, когда мы делаем побитовую операцию И с нашими character code (в этом случае, 162, который имеет двоичное значение 10100010) побитовая операция выглядит так:

  11110000
& 10100010
----------
10100000

И когда преобразуется обратно в свое десятичное значение, 10100000 является 160,

Поэтому мы эффективно сохранили «левую сторону» битов от оригинала character code значение и избавились от «правой стороны» битов.

Маска Пример 2

Во втором примере маски маска 0x0f (который имеет двоичное значение 00001111) в побитовой операции И будет иметь следующий двоичный результат:

  00001111
& 10100010
----------
00000010

Который при преобразовании обратно в свое десятичное значение 2,

Поэтому мы эффективно сохранили «правую сторону» битов от оригинала character code значение и избавились от «левой стороны» битов.

Маска Пример 3

Наконец, третий пример маски показывает, что происходит при использовании маски 0x00 (который 00000000 в двоичном виде) в побитовой операции И:

  00000000
& 10100010
----------
00000000

Что приводит к 0,

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]