Я пытаюсь декодировать некоторые специальные символы в php и не могу найти способ сделать это.
$str = 'Thi’s i"s a’n e”xa“mple';
Это просто возвращает несколько точек.
$str = preg_replace_callback("/(&#[0-9]+;)/", function($m) {
return mb_convert_encoding($m[1], "UTF-8", "HTML-ENTITIES");
}, $str);
Некоторые другие тесты просто возвращают ту же строку.
$str = html_entity_decode($str, ENT_QUOTES, 'UTF-8');
$str = htmlspecialchars_decode($str, ENT_QUOTES);
Во всяком случае, я пробовал всевозможные комбинации, но на самом деле не представлял, как преобразовать это в символы UTF-8.
То, что я ожидаю увидеть, это:
Thi’s i"s a’n e”xa“mple
И на самом деле, если я возьму это прямо и использовать htmlentities
для кодирования я вижу разные символы для начала.
Thi’s i"s a’n e”xa“mple
К сожалению, у меня нет контроля над источником, и я застрял в отношениях с этими персонажами.
Являются ли они нестандартными, мне нужно заменить их вручную на мою таблицу поиска?
РЕДАКТИРОВАТЬ
Глядя на эту таблицу здесь: https://brajeshwar.github.io/entities/
Я вижу персонажей, которых я ищу, нет в списке. Когда я тестирую несколько символов из этой таблицы, они прекрасно декодируются. Я думаю, что список в PHP не является полным по умолчанию?
Если вы проверите стандарт Юникода для символов, на которые вы ссылаетесь: http://www.unicode.org/charts/PDF/U0080.pdf
Вы увидите, что все кодовые точки, которые есть в вашей строке, не имеют представимых глифов и являются управляющими символами.
Это означает, что ожидается, что они будут отображаться как пустые квадраты (или точки, в зависимости от того, как ваш обработчик обрабатывает их).
Если это работает для кого-то где-то — это нестандартное поведение, на которое нельзя полагаться, так как оно, ну, в общем, нестандартное.
Очевидно, у вашего текста есть начальная кодировка cp1250, поэтому вы должны либо обработать его соответствующим образом, либо перекодировать объекты вручную:
$str = 'Thi’s i"s a’n e”xa“mple';
$str = preg_replace_callback("/&#([0-9]+);/u", function($m) {
return iconv('cp1250', 'utf-8', chr($m[1]));
}, $str);
echo $str;
Других решений пока нет …