2008-09-22 3 views
2

Comment les chaînes UTF-8 (chaîne de 8 bits) peuvent-elles être converties en/depuis des chaînes de caractères 7 bits compatibles XML (ie ASCII imprimable avec des entités numériques)?Conversion d'une chaîne UTF-8 vers/à partir de XML 7 bits en PHP

-à-dire une fonction encode() telle que:

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

decode() serait également utile:

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

la paire de PHP htmlenties()/html_entity_decode() ne fait pas la bonne chose:

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

Spécification laborieuse des types h ELPS un peu, mais toujours renvoie des entités nommées XML incompatibles, les non numériques:

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

Répondre

0

Il est un peu d'une solution de contournement, mais je lis un peu iconv() et je ne pense pas que ça va vous donner numérique entités (non mises à l'épreuve)

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

Cependant, j'ai mis à l'épreuve. Je pourrais faire l'inverse plus tard, ne retenez pas votre souffle ;-)

6

mb_encode_numericentity fait exactement cela.

+0

impressionnant, je ne le savais pas encore :) – Kris

+0

Je pense que mb_encode_numericentity fera la bonne chose, mais trouver les bons arguments est difficile. (La partie difficile semble préserver (c'est-à-dire ne pas convertir) les caractères ASCII et de ponctuation imprimables (par exemple, "&" doit aller à "&", mais "^" peut rester tel quel). – mjs