Лучшее объяснение $convmap в mb кодирует числовое значение()
Описание, данное этому параметру convmap
для метода mb_encode_numericentity
в руководстве по php , для меня расплывчато. Может ли кто-нибудь помочь с лучшим объяснением этого или, может быть, "заглушить это", если этого будет достаточно для меня? Что означают элементы массива, используемые в этом параметре? Пример 1 на странице руководства содержит
<?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
в этом контексте?
1 answers
Глядя в кроличью нору , кажется, что комментарии в документации для 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: �
Примечания:
Этот ответ не предполагает подробного описания маскировки , но маскировка может помочь сохранить или удалить определенные биты из заданного значения.
Пример маски 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
.