2011-01-29 2 views
0

J'ai une chaîne qui est dans ma base de données comme 中华武魂 lorsque je poste ma demande pour récupérer les données via mon site Web Je reçois les données au serveur dans le format %E4%B8%AD%E5%8D%8E%E6%AD%A6%E9%AD%82Traduire des données URLENCODED en UTF-8 en PHP

Quelles étapes de décodage dois-je prendre pour pouvoir revenir à la forme utilisable? Vous nettoyez également l'entrée utilisateur pour vous assurer qu'elle n'essaiera pas d'une attaque par injection SQL? (chaîne d'échappement avant ou après codage?)

EDIT:

rawurldecode(); // returns "中åŽæ­¦é­‚" 
urldecode();  // returns "中åŽæ­¦é­‚" 


public function utf8_urldecode($str) { 
    $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($str)); 
    return html_entity_decode($str,null,'UTF-8'); 
} 
// returns "中åŽæ­¦é­‚" 

... qui fait fonctionne quand je tente de l'utiliser dans une instruction SQL.

Je pense parce que je faisais un echo et die(); sans spécifier un en-tête de UTF-8 (donc je suppose que me lisait un latin comme)

Merci pour l'aide!

+2

Vous ne semblez pas utiliser UTF-8 pour votre sortie mais Windows-1252. – Gumbo

Répondre

2

Lorsque vos données est en fait que sous forme de pour cent codé, il vous suffit d'appeler rawurldecode:

$data = '%E4%B8%AD%E5%8D%8E%E6%AD%A6%E9%AD%82'; 
$str = rawurldecode($data); 

Il suffit que les données sont déjà encodés en UTF-8: (U + 4E2D) est encodée avec la séquence d'octets 0xE4B8AD en UTF-8 et qui est codée avec %E4%B8%AD lors de l'utilisation du codage en pourcentage.

Que votre sortie ne semble pas être comme prévu est probablement parce que la sortie est interprétée avec un mauvais codage de caractères, probablement Windows-1252 au lieu de UTF-8. Parce que dans Windows-1252, 0xE4 représente ä, 0xB8 représente ¸, 0xAD représente å et ainsi de suite. Alors assurez-vous de specify the output character encoding properly.

1

urldecode Utilisons PHP: http://php.net/manual/en/function.urldecode.php

Vous avez le choix ici: urldecode ou rawurldecode.

Si vous avez encodé votre chaîne en utilisant urlencode, vous devez utiliser urldecode en raison de la façon dont les espaces sont traités. Alors que urlencode convertit les espaces en +, ce n'est pas la même chose avec rawurlencode.