Için / PHP 7-bit XML bir UTF-8 dizesi dönüştürmek

2 Cevap php

Nasıl utf-8 olabilir dizeleri (örneğin 8-bit dizisi) XML uyumlu 7-bit dizeleri (sayısal varlık yani yazdırılabilir ASCII) için / dönüştürülebilir?

yani bir encode() fonksiyonu, öyle ki:

encode("“£”") -> "“£”"

decode() de yararlı olacaktır:

decode("“£”") -> "“£”"

PHP'nin htmlenties() / html_entity_decode() çifti doğru olanı yapmaz:

htmlentities(html_entity_decode("“£”")) ->
  "“£”"

Zahmetle türlerini belirterek biraz yardımcı olur, ama yine de XML-uyumsuz adlı varlıkları değil, sayısal olanları döndürür:

htmlentities(html_entity_decode("“£”", ENT_QUOTES, "UTF-8"), ENT_QUOTES, "UTF-8") ->
  "“£”"

2 Cevap

Bu bir çözüm biraz, ama iconv() hakkında biraz okumak ve ben size (test koymak değil) sayısal varlıkları vereceğim sanmıyorum

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 );
}

Bu ancak, test koyduk. Ben sadece nefesinizi tutmayın, sonra tersini yapabilir ;-)