2

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") ->
  "“£”"
4

2 に答える 2

6

mb_encode_numericentity正確にそれを行います。

于 2008-10-11T12:24:50.727 に答える
0

これは少し回避策ですが、少し読んだ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 );
}

しかし、これは私がテストしました。後で逆にするかもしれませんが、息を止めないでください;-)

于 2008-10-10T21:16:27.267 に答える