Как можно преобразовать строки UTF-8 (т. Е. 8-битную строку) в / из XML-совместимых 7-битных строк (т. Е. Печатаемых ASCII с числовыми объектами)?
то есть функция encode() такая, что:
encode("“£”") -> "“£”"
decode() также будет полезен:
decode("“£”") -> "“£”"
Пара PHP htmlenties() / html_entity_decode() не работает правильно:
htmlentities(html_entity_decode("“£”")) ->
"“£”"
Тщательное указание типов немного помогает, но все же возвращает именованные сущности, несовместимые с XML, а не числовые:
htmlentities(html_entity_decode("“£”", ENT_QUOTES, "UTF-8"), ENT_QUOTES, "UTF-8") ->
"“£”"






Это своего рода обходной путь, но я немного читал о iconv() и не думаю, что он даст вам числовые объекты (не проверяемые)
function decode( $string )
{
$doc = new DOMDocument( "1.0", "UTF-8" );
$doc->LoadXML( '<?xml version = "1.0" encoding = "UTF-8"?>'."\n".'<x />', LIBXML_NOENT );
$doc->documentElement->appendChild( $doc->createTextNode( $string ) );
$output = $doc->saveXML( $doc );
$output = preg_replace( '/<\?([^>]+)\?>/', '', $output );
$output = str_replace( array( '<x>', '</x>' ), array( '', '' ), $output );
return trim( $output );
}
Однако я испытал это на практике. Я мог бы сделать обратное позже, только не задерживайте дыхание ;-)
mb_encode_numericentity делает именно это.
Я думаю, что mb_encode_numericentity поступит правильно, но найти правильные аргументы сложно. (Похоже, что самая сложная часть - это сохранение (т.е. не преобразование) печатаемых символов ASCII и знаков препинания. (Например, «&» нужно заменить на «& amp;», а «^» можно оставить как есть).
круто, я этого еще не знала :)