2015-06-29 15 views
16

Tôi đang sử dụng Laravel (một khuôn khổ PHP) để viết dịch vụ cho thiết bị di động và có dữ liệu được trả về ở định dạng JSON. Trong kết quả dữ liệu có một số trường được mã hóa trong UTF-8.'Các ký tự UTF-8 không đúng định dạng, có thể được mã hóa không chính xác' trong Laravel

Tuyên bố sau

return JsonResponse::create($data); 

trả về lỗi dưới đây

InvalidArgumentException 
HELP 
Malformed UTF-8 characters, possibly incorrectly encoded 

Open: /var/www/html/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php 
     } catch (\Exception $exception) { 
      restore_error_handler(); 

      throw $exception; 
     } 

     if (JSON_ERROR_NONE !== json_last_error()) { 
      throw new \InvalidArgumentException($this->transformJsonError()); 
     } 

Tôi đã thay đổi:

return JsonResponse::create($data); 

để

return JsonResponse::create($data, 200, array('Content-Type'=>'application/json; charset=utf-8')); 

nhưng vẫn không hoạt động.

Làm cách nào để khắc phục sự cố?

+0

'$ data' là gì? Nó đến từ đâu, có gì trong đó, làm thế nào để bạn biết nó được mã hóa UTF-8? – deceze

+0

$ data là dữ liệu mảng từ cơ sở dữ liệu. Tôi đã kiểm tra dữ liệu $, nó có một chuỗi "兆 琪" => lỗi khi trả về json. –

+0

Nó cố định, đó là lỗi của tôi. Có mã hàng không tốt: chất nền ('兆 琪', ...) Cảm ơn! –

Trả lời

24

Tôi đã viết phương pháp này, để xử lý các mảng UTF8 và các vấn đề về JSON. Nó hoạt động tốt với mảng (đơn giản và đa chiều).

/** 
* Encode array from latin1 to utf8 recursively 
* @param $dat 
* @return array|string 
*/ 
    public static function convert_from_latin1_to_utf8_recursively($dat) 
    { 
     if (is_string($dat)) { 
     return utf8_encode($dat); 
     } elseif (is_array($dat)) { 
     $ret = []; 
     foreach ($dat as $i => $d) $ret[ $i ] = self::convert_from_latin1_to_utf8_recursively($d); 

     return $ret; 
     } elseif (is_object($dat)) { 
     foreach ($dat as $i => $d) $dat->$i = self::convert_from_latin1_to_utf8_recursively($d); 

     return $dat; 
     } else { 
     return $dat; 
     } 
    } 
// Sample use 
// Just pass your array or string and the UTF8 encode will be fixed 
$data = convert_from_latin1_to_utf8_recursively($data); 
0

Trong trường hợp của tôi, điều này gây ra lỗi:

return response->json(["message" => "Model status successfully updated!", "data" => $model], 200); 

nhưng điều này không:

return response->json(["message" => "Model status successfully updated!", "data" => $model->toJson()], 200); 
0

Lỗi này cũng sẽ xảy ra nếu bạn không kích hoạt cơ sở dữ liệu Mysql của bạn hoặc Oracle vv .. .

Các vấn đề liên quan