2009-11-18 6 views
0

Donc je travaille sur un projet qui prend des données à partir d'un fichier, dans le fichier certaines lignes nécessitent des symboles utf8 mais sont codées bizarrement, elles sont par exemple \ ÆProblème de conversion utf8 bizarre en php

Si je fais comme suit:

$name = "\xC6ther"; 
$name = preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name); 
echo utf8_encode($name); 

Il fonctionne très bien. Je reçois ceci:

Æther 

Mais si je tire les mêmes données de MySQL, et procédez comme suit:

$name = $row['OracleName']; 
$name = preg_replace('/x([a-fA-F0-9]{2})/', '\&#$1;', $name); 
$name = utf8_encode($name); 

Ensuite, je reçois cela comme sortie:

\&#C6;ther 

Quelqu'un sait pourquoi c'est?

Comme demandé, vardump de $ row ['OracleName'];

string(15) "xC6ther Barrier" 

Répondre

1

sur votre deuxième preg_replace pourquoi il y a je pense \

preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name); 

ok il y a une certaine confusion. vous expression régulière est correspondant à quelque chose comme x66 et le remplacerait par ce « & # 66 », ce qui semble être une html entities encodage pour moi, mais vous utilisez utf8_encode qui font que (du manuel):

utf8_encode - Encode une chaîne ISO-8859-1 en UTF-8

pour que les choses ne seraient jamais converties ... (ou pour être plus précis, le « & # 66 » serait « reste & # 66 » car ils sont tous mêmes caractères dans ISO-8859-1 et UTF-8)

également à noter sur votre premier extrait que vous utilisez \xC6 mais cela ne sera jamais attrapé par le preg_replace car il est déjà codé. Le \x signifie que le prochain nombre hexadécimal (0x00 ~ 0xFF) serait déposé dans la chaîne tel quel. Je ne suis pas confus de ce que vous voulez vraiment faire. en quoi consiste le preg_replace?

si vous voulez convertir des entités HTML pour regarder UTF-8 dans mb_convert_encoding (manual), si vous voulez faire l'inverse, le code dans les entités HTML de certains UTF-8 regard sur htmlentities (manual)

et si cela n'a rien à voir avec tout cela et que vous voulez simplement changer l'encodage mb_convert_encoding est toujours là.

+0

Lorsque les données proviennent de MySQL, il manque le \, bien que les données soient dans la table mysql elle-même. –

+0

désolé j'ai manqué votre point, pouvez-vous nous montrer comment regarder $ row ['OracleName'] 'avec' var_dump' – RageZ

0

cernées le problème, sur l'attraction SQL m'a manqué un « x » dans le preg_replace

preg_replace('/x([a-fA-F0-9]{2})/', '&#x$1;', $name); 

Une fois que j'ajouté dans le x, cela a fonctionné comme un charme.

+0

@Trick: Je ne sais vraiment pas ce que vous faites ** mais ** si votre problème est correctif c'est – RageZ

+0

@Trick: à droite le nombre est en hexadécimal, donc ça devrait être '& # xNN', mais je suis toujours préoccupé par votre reg reg correspondant par exemple' xaa' comme étant un encodage où ce n'est pas – RageZ