Лучшее объяснение $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 в этом контексте?

Author: Nick Rolando, 2016-03-08

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: &#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.

 3
Author: summea, 2017-05-23 12:00:52