Я пытаюсь декодировать закодированную длинную черту с числового объекта на строку, но кажется, что я не могу найти функцию, которая может сделать это правильно.
Лучшее, что я нашел, это mb_decode_numericentity (), однако по какой-то причине он не может декодировать длинную тире и некоторые другие специальные символы.
$str = '–'; $str = mb_decode_numericentity($str, array(0xFF, 0x2FFFF, 0, 0xFFFF), 'ISO-8859-1');
Это вернет «?».
Кто-нибудь знает, как решить эту проблему?
Следующий фрагмент кода (в основном украденный здесь и улучшенный) будет работать для буквенных, числовых десятичных и числовых шестизначных сущностей:
header("content-type: text/html; charset=utf-8"); /** * Decodes all HTML entities, including numeric and hexadecimal ones. * * @param mixed $string * @return string decoded HTML */ function html_entity_decode_numeric($string, $quote_style = ENT_COMPAT, $charset = "utf-8") { $string = html_entity_decode($string, $quote_style, $charset); $string = preg_replace_callback('~&#x([0-9a-fA-F]+);~i', "chr_utf8_callback", $string); $string = preg_replace('~&#([0-9]+);~e', 'chr_utf8("\\1")', $string); return $string; } /** * Callback helper */ function chr_utf8_callback($matches) { return chr_utf8(hexdec($matches[1])); } /** * Multi-byte chr(): Will turn a numeric argument into a UTF-8 string. * * @param mixed $num * @return string */ function chr_utf8($num) { if ($num < 128) return chr($num); if ($num < 2048) return chr(($num >> 6) + 192) . chr(($num & 63) + 128); if ($num < 65536) return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); if ($num < 2097152) return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128); return ''; } $string ="”"; echo html_entity_decode_numeric($string);
Предложения по улучшению приветствуются.
mb_decode_numericentity
не обрабатывает шестнадцатеричный, только десятичный. Получаете ли вы ожидаемый результат:
$str = '–'; $str = mb_decode_numericentity ( $str , Array(255, 3145727, 0, 65535) , 'ISO-8859-1');
Вы можете использовать hexdec
для преобразования шестнадцатеричного в десятичное.
Кроме того, из любопытства, работает ли следующая работа:
$str = '–'; $str = html_entity_decode($str);