2015-03-25 1 views
9

Je rencontre des problèmes avec JsonResponse sur Debian Stable php5 (5.4.39-0 + deb7u1) lorsque je renvoie des caractères UTF8.Problèmes d'encodage Symfony2 JsonResponse utf8 sur Debian Stable php-5.4

J'ai développé une application sur Debian Testing php5 (5.6.6 + dfsg-2) et le code suivant a fonctionné comme un charme:

$response = new JsonResponse(); 
$response->headers->set('Content-Type', 'application/json'); 
$response->setData($data); 
return $response; 

mais après déploiement sur le serveur de prod stable j'ai commencé à la suite exception pour exactement le même DB/charsets données etc:

request.CRITICAL: Uncaught PHP Exception InvalidArgumentException: "Malformed UTF-8 characters, 
possibly incorrectly encoded." at /site/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/JsonResponse.php 
line 123 {"exception":"[object] (InvalidArgumentException(code: 0): 
Malformed UTF-8 characters, possibly incorrectly encoded. at 
/site/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/JsonResponse.php:123)"} [] 

La réponse de DB qui est transmis sous forme de données $ DO contient les caractères UTF8 que je ne peux pas contrôler. Je dois juste les montrer.

Je suppose que j'ai atteint un bug de 5.4, mais comment puis-je facilement le contourner? Je ne ai essayé:

$response = new JsonResponse(); 
    $response->headers->set('Content-Type', 'application/json'); 
    $response->setEncodingOptions(JSON_UNESCAPED_UNICODE); 
    $response->setData($data); 
    return $response; 

mais je reçois la même erreur.

Des idées?

Répondre

8

Après un certain canal #symfony discutaient je trouve une solution de contournement:

$response = new Response(json_encode($data, JSON_UNESCAPED_UNICODE)); 
    $response->headers->set('Content-Type', 'application/json'); 
    return $response; 

D'autres solutions agréables sont les bienvenus. Je considère cette solution comme un hack sale ...

1

Je pense que vous n'obtenez pas une chaîne UTF-8 valide. Essayez de savoir pourquoi il existe des byteblocks utf8 invalides (http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences).

Vous pouvez analyser les octets avec unpack: https://stackoverflow.com/a/11466734/4469738

+0

Je ne sais vraiment pas si je reçois un UTF8 valide. Les données d'entrée proviennent de sources externes (e-mails) et je dois simplement les afficher. Je ne peux pas le reformater, donc je devrais y échapper d'une manière ou d'une autre. –