2010-01-29 7 views
0

J'ai beaucoup de problèmes avec les valeurs Unicode (UTF-16) et PHP/XML. Je souhaite lire un ensemble de valeurs Unicode à partir de XML et afficher les glyphes corrects dans le navigateur. J'ai essayé avec UTF-8 et j'ai le même problème.Lecture de valeurs UTF-16 (ou UTF-8) à partir de XML et affichage du résultat avec PHP

Ceci est un exemple de travail simple, j'ai utilisé pour mon premier test:

$text = "\x00\x41"; 

$text = mb_convert_encoding($text, "ASCII", "UTF-16"); 

echo $text; 

sortie du code ci-dessus:

A 

Cependant, lorsque je tente d'obtenir les valeurs des choses XML cessent de fonctionner .

XML:

<glyphs> 
    <code>0041</code> 
    <code>0042</code> 
    <code>0043</code> 
    <code>0044</code> 
    <code>0045</code> 
    <code>0046</code> 
</glyphs> 

en php je lis chaque valeur du xml ci-dessus, divisé en paires et le format, par exemple \ X00 \ x41, etc.

PHP:

// load xml 
$xml = simplexml_load_file('encoding.xml'); 

if ($xml) { 

    // get families 
    foreach($xml->children() as $item) { 

     $pairs = str_split($item, 2); 

     $hex = "\x" . $pairs[0] . "\x" . $pairs[1]; 

     // check value... 
     echo $hex . '<br/>'; 

     $text = mb_convert_encoding($hex, "ASCII", "UTF-16"); 

     echo $text; 
    } 

} 
else { 
    return 'The input is malformed.'; 
} 

sortie dans le navigateur:

\x00\x41 
???? 
\x00\x42 
???? 
\x00\x43 
???? 
\x00\x44 
???? 
\x00\x45 
???? 
\x00\x46 
???? 

points d'interrogation doit être A, B, C, D, E, F.

Qu'est-ce que je fais mal?

Merci.

Répondre

0

Réglez-vous correctement la sortie dans votre en-tête?

header('Content-Type: text/html; charset=utf-8'); 

... et aussi dans la tête HTML?

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
+0

Le code de DB est en train de convertir en utf-16, donc je spécifierais que charset plutôt que utf-8. –

+0

Oui, le jeu de caractères est défini. –

1

"\ x00" est une notation hexadécimale intérieur d'une chaîne, qui est traité au moment de la compilation .
Je pense que lorsque vous utilisez "\ x" + "00" le compilateur essaie d'abord de comprendre ce que "\ x" est (je ne sais pas quel est le résultat), et concatène ensuite seulement le "00", donc le résultat n'est pas ce que vous attendez.

Peut-être que cette question peut aider, bien qu'il soit en Java ->Java: Convert String "\uFFFF" into char

EDIT: juste après sur le commentaire. Placer le "\ x41" littéral dans votre fichier XML n'aidera pas non plus, parce que vous lisez alors une chaîne de 4 caractères.
Donc, votre problème peut être réécrit comme: comment convertir une représentation sous forme de chaîne de valeurs numériques en hexadécimales en un seul caractère, en utilisant UTF-16. C'est le même problème que dans la question que j'ai liée ci-dessus, sauf que vous voulez le faire en PHP, pas Java.

+0

Je me demandais à ce sujet aussi. J'ai essayé de changer le XML en \x00\x41 et en supprimant la fente de chaîne et la concaténation. Cela n'a pas fonctionné - j'ai le même résultat. Je vais regarder dans un peu plus. –

+0

\ x00 dans le fichier XML brut vous obtient une chaîne de 4 caractères en mémoire. Vous devez l'analyser et le convertir en un seul caractère, c'est pourquoi je vous ai référé à l'autre question SO. Je sais comment le faire en Java, pas en PHP – Yoni

1

Votre programme de test écrit pour chaque caractère de test quelques caractères ASCII suivis de '
' en ASCII suivi de deux octets de type UTF-16. Cela ne marchera pas. Un fichier ne doit utiliser qu'un seul codage de caractères à la fois. Commencez par réécrire votre script pour convertir toutes les sorties en UTF-16 (ou autre).Deuxièmement, il semble que votre navigateur interprète votre fichier d'encodage mixte comme autre chose que UTF-16, peut-être ISO 8859-1, ou Windows Latin 1, qui sont des valeurs par défaut courantes. Il est peu probable qu'un navigateur interprète un fichier comme UTF-16 unless explicitly directed to (in the HTTP header or content type meta tag). Si vous avez laissé un type de contenu non spécifié (vérifiez si votre serveur Web envoie une valeur par défaut), certains navigateurs tentent de deviner l'encodage. Je doute que l'on devine que votre fichier mixte était UTF-16. N'attendez pas que quelque chose fonctionne comme vous le souhaitez tant que vous n'avez pas vérifié que le navigateur interprète le fichier en fonction du type de contenu que vous spécifiez.

Enfin, je recommande d'utiliser iconv au lieu de mb_convert_encoding. iconv est mieux maintenu et dispose d'un ensemble plus large de codages supportés.

+0

Merci. Je ne suis pas sûr de savoir comment faire cela. Mon fichier XML contient des valeurs UTF-16 que je veux interpréter en PHP. Cela ne me dérange pas si ces valeurs sont converties en un autre encodage, je veux juste 0041 pour afficher un A, 0042 un B, et ainsi de suite. En fin de compte, je produirai une image en utilisant imagettftext. –