Описание, данное этому параметру, 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
значит в этом контексте?
Глядя вниз Кроличья нора, кажется, что комментарии в документации для 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: ¢
<?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: £
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:   original: ¢ converted:  original: ¢ converted: �
Этот ответ не намерен охватывать маскировка в мельчайших деталях, но маскировка может помочь сохранить или удалить определенные биты от данного значения.
Итак, в первом примере маски 0xf0
, f
указывает, что мы хотим сохранить значения в левой части двоичного значения. Вот, f
имеет двоичное значение 1111
а также 0
имеет двоичное значение 0000
— в совокупности становится ценностью 11110000
,
Затем, когда мы делаем побитовую операцию И с нашими character code
(в этом случае, 162
, который имеет двоичное значение 10100010
) побитовая операция выглядит так:
11110000
& 10100010
----------
10100000
И когда преобразуется обратно в свое десятичное значение, 10100000
является 160
,
Поэтому мы эффективно сохранили «левую сторону» битов от оригинала character code
значение и избавились от «правой стороны» битов.
Во втором примере маски маска 0x0f
(который имеет двоичное значение 00001111
) в побитовой операции И будет иметь следующий двоичный результат:
00001111
& 10100010
----------
00000010
Который при преобразовании обратно в свое десятичное значение 2
,
Поэтому мы эффективно сохранили «правую сторону» битов от оригинала character code
значение и избавились от «левой стороны» битов.
Наконец, третий пример маски показывает, что происходит при использовании маски 0x00
(который 00000000
в двоичном виде) в побитовой операции И:
00000000
& 10100010
----------
00000000
Что приводит к 0
,
Других решений пока нет …