2016-11-10 7 views
1

Ich benutze Opencart, und obwohl ich grundsätzlich jeden Beitrag auf Google zu diesem Thema gesehen habe, kann ich nicht herausfinden, warum die Datenbank Buchstaben mit Akzenten in einer nicht utf8 Codierung speichert.PHP json_encode Codierung von Akzenten in Worten

print_r($this->request->post); 

Rückkehr: Array ([pfa_status] => 1 [pfa_text] => 'Cobrança'); aber nach dem json_encode aplying es wird:

{"pfa_status":"1","pfa_text":"Cobran\u00e7a"} 

nun durch an allen möglichen Lösungen durch Web-Suche:

  1. Ich benutze <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  2. I habe versucht header('Content-type: text/plain; charset=utf-8');
  3. Alle meine Dateien haben das Format utf-8 without BOM
  4. Ich benutze $this->connection->set_charset("utf8");
  5. Ich benutze $this->connection->query("SET NAMES 'UTF8'");
  6. Mein Feld in der Datenbank, wo die json gespeichert wird, hat die Sortierung utf8_bin
  7. Wenn json_decode die Verwendung mit falsch bleibt Codierung
  8. json_encode($this->request->post, JSON_UNESCAPED_UNICODE); Versuchte

So whene ver zeige ich den Wert von pfa_text nach der Decodierung, es zeigt Cobran\u00e7a anstelle von Cobrança.

Was fehlt mir?


EDIT 1: Wie gewünscht, hier ist mein Code nur zum Zweck der Prüfung.

class ControllerPfa extends Controller 
{ 
    public function index() 
    { 
     if (($this->request->server['REQUEST_METHOD'] == 'POST')) 
     { 
      $value = json_encode($this->request->post, JSON_UNESCAPED_UNICODE); 
      print_r($value); 

      die(); 
     } 
    } 
} 

So ist der Ausgang (und zu beachten, dass es die volle Strom $ ist _POST Antwort):

{"pfa_status":"1","pfa_sort_order":"","pfa":[{"payment_method":"cod","description":{"1":{"name":"Tax"},"3":{"name":"Cobran\u00e7a"},"4":{"name":"Cobran\u00e7a"}}}]} 

EDIT 2: Ich bin mit der Version 7.0 von PHP

enter image description here


EDIT 3: Gelöst, ermöglicht die folgende Funktion das perfekte Einfügen der Wörter in die Datenbank mit Akzenten.

private function formatEncoding($value) 
{ 
    return preg_replace_callback('/\\\\u(\w{4})/', function ($matc) 
    { 
     return html_entity_decode('&#x' . $matc[1] . ';', ENT_COMPAT, 'UTF-8'); 
    }, $value); 
} 

Also, alles, was wir tun müssen, ist formatEncoding(json_encode($this->request->post));

+0

Deceze, es ist nicht dupliziert, wenn die Antworten in diesem Beitrag nicht w Ork für mich, findest du nicht? – Linesofcode

+1

FWIW, dies ist in keiner aktuellen PHP-Version reproduzierbar: https://3v4l.org/6I1l4. Entweder ist etwas an der Eingabe nicht so, wie du denkst, oder du liegst irgendwie unerwartet auf einer alten PHP-Version. – deceze

+0

Wie sieht es mit meinem Post aus? Ich poste sogar einen Print meiner aktuellen PHP-Version. – Linesofcode

Antwort

1

Eine der Optionen rufen Sie in der second parameter von json_encode ist JSON_UNESCAPED_UNICODE passieren kann. Dies wird wie folgt beschrieben:

Multibyte-Unicode-Zeichen wörtlich codieren (Standard ist das Entkommen als \ uXXXX).Verfügbar seit PHP 5.4.0.

Wenn Sie also passieren, dass, sollte es funktionieren, weil es sie daran hindert, entkommen ist:

$json = json_encode($data, JSON_UNESCAPED_UNICODE); 
+0

Funktioniert auch nicht. Ich habe das versucht. – Linesofcode

+1

Welche Version von PHP verwenden Sie? –

+0

Version 7, siehe meinen bearbeiteten Beitrag bitte. – Linesofcode

1

Sie haben die Flagge JSON_UNESCAPED_UNICODE (siehe documentation)

wie folgt zu verwenden:

echo json_encode(
    $data , 
    JSON_UNESCAPED_UNICODE 
); 
+0

Vergessen zu erzählen, dass ich das ohne Erfolg versucht habe. – Linesofcode

+0

Ja, das wäre eine wertvolle Information gewesen. Könnten Sie möglicherweise ein minimales Beispiel Ihres Codes für das weitere Debuggen bereitstellen? –

+0

Sehen Sie sich meinen bearbeiteten Post an. – Linesofcode