Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erklärung der PHP-Funktion json_encode() und des Problems mit chinesischem verstümmeltem Code

Detaillierte Erklärung der PHP-Funktion json_encode() und des Problems mit chinesischem verstümmeltem Code

高洛峰
高洛峰Original
2016-12-27 16:05:503302Durchsuche

Mit der in PHP integrierten Funktion json_encode() (PHP > 5.2) können Daten in PHP übertragen und gut mit anderen Sprachen verwendet werden.

Die Funktion dieser Funktion besteht darin, numerische Werte in das JSON-Datenspeicherformat zu konvertieren.

<?php
$arr = array
  (
   &#39;Name&#39;=>&#39;希亚&#39;,
   &#39;Age&#39;=>
  );
$jsonencode = json_encode($arr);
echo $jsonencode;
?>

Die Ergebnisse der Programmausführung lauten wie folgt:

{"Name":null,"Age":}

Das chinesische Zeichen in der json_encode-Funktion ist als null codiert und ich habe festgestellt, dass es sehr einfach ist, sich eng in das Frontend zu integrieren. Ich denke, dass dies der Fall ist Front-End-Javascript ist auch utf-.

<?php
$array = array
 (
  &#39;title&#39;=>iconv(&#39;gb&#39;,&#39;utf-&#39;,&#39;这里是中文标题&#39;),
  &#39;body&#39;=>&#39;abcd...&#39;
 );
echo json_encode($array);
?>

Das laufende Ergebnis dieses Programms ist:

{"title":"u8fd9u91ccu662fu4e2du6587u6807u9898","body":"abcd ..."🎜>

Alle chinesischen Zeichen im Array fehlen oder u2353 usw. erscheinen nach json_encode.

Die Lösung besteht darin, die Funktion urlencode() zu verwenden, um Folgendes zu verarbeiten: Verwenden Sie vor json_encode urlencode(), um den gesamten Inhalt aller Arrays zu verarbeiten, und konvertieren Sie ihn dann mit json_encode() in einen JSON-String. und schließlich verwenden urldecode () Konvertieren Sie das codierte Chinesisch zurück.

<?php
/**************************************************************
 *
 * 使用特定function对数组中所有元素做处理
 * @param string &$array  要处理的字符串
 * @param string $function 要执行的函数
 * @return boolean $apply_to_keys_also  是否也应用到key上
 * @access public
 *
 *************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
 static $recursive_counter = ;
 if (++$recursive_counter > ) {
  die(&#39;possible deep recursion attack&#39;);
 }
 foreach ($array as $key => $value) {
  if (is_array($value)) {
   arrayRecursive($array[$key], $function, $apply_to_keys_also);
  } else {
   $array[$key] = $function($value);
  }
  if ($apply_to_keys_also && is_string($key)) {
   $new_key = $function($key);
   if ($new_key != $key) {
    $array[$new_key] = $array[$key];
    unset($array[$key]);
   }
  }
 }
 $recursive_counter--;
}
/**************************************************************
 *
 * 将数组转换为JSON字符串(兼容中文)
 * @param array $array  要转换的数组
 * @return string  转换得到的json字符串
 * @access public
 *
 *************************************************************/
function JSON($array) {
 arrayRecursive($array, &#39;urlencode&#39;, true);
 $json = json_encode($array);
 return urldecode($json);
}
$array = array
  (
   &#39;Name&#39;=>&#39;希亚&#39;,
   &#39;Age&#39;=>
  );
echo JSON($array);
?>

Diesmal war es erfolgreich, die Laufergebnisse sind wie folgt:

{"Name":"Xia"," Alter": "20"🎜>

Im Folgenden wird Ihnen die Lösung für chinesische verstümmelte Zeichen in PHP json_encode vorgestellt

Ich glaube, dass viele Menschen bei der Verwendung von Ajax auf das Problem chinesischer verstümmelter Zeichen gestoßen sind Interagieren Sie mit der Hintergrund-PHP-Seite. Als leichtes Datenaustauschformat ist JSON sehr beliebt. Die Verwendung von PHP als Backend-Interaktion ist jedoch anfällig für das Problem verstümmelter chinesischer Zeichen. JSON ist dasselbe wie js. Client-Zeichen werden in der Form von UTF8 verarbeitet. Das heißt, wenn JSON als Datenformat für die Übermittlung und den Empfang verwendet wird, werden die Zeichen in UTF8 codiert Bei der Verwendung von UTF8 kommt es sehr leicht zu verstümmelten chinesischen Zeichen. Die Lösung besteht natürlich darin, UTF8 zu verwenden, wenn JSON-Daten mit js oder PHP verarbeitet werden.

PHP5.2 oder höher verwendet json_encode als integrierte Funktion, was den Website-Erstellern großen Komfort bietet. Wir müssen jedoch beachten, dass json_encode nur UTF8-codierte Zeichen unterstützt. Andernfalls werden chinesische Zeichen verstümmelt. Oder es erscheint ein Nullwert.


Die Lösung gliedert sich in die folgenden zwei Schritte.

Schritt 1

Stellen Sie sicher, dass die Zeichen bei der Verarbeitung von JSON in UTF8 codiert sind. Insbesondere können wir sowohl die Datenbankkodierung als auch die Seitenkodierung auf UTF8 ändern. Wenn Sie die GBK-Kodierung verwenden möchten, können Sie die Zeichen natürlich vor der JSON-Verarbeitung in UTF8 konvertieren. Es gibt die folgenden Methoden in PHP:

<?php
  $data="JSON中文";
  $newData=iconv("GB2312","UTF-8//IGNORE",$data);
  echo $newData;
  //ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符都不会被保存。
  //或是("GB2312","UTF-8",$data);
?>

Schritt2

Backend-PHP-Seite (die Seite ist als UTF-8 oder codiert). Zeichen wurden für UTF-8 konvertiert) verwenden Sie json_encode, um das Array-Array in PHP in einen JSON-String zu konvertieren. Zum Beispiel:

<?php
 $testJSON=array(&#39;name&#39;=>&#39;中文字符串&#39;,&#39;value&#39;=>&#39;test&#39;);
 echo json_encode($testJSON);
?>

Ausgabeergebnis anzeigen:

{“name“:“u4e2du6587u5b57u7b26u4e32″“,value“:“test ” }

Es ist ersichtlich, dass selbst bei Verwendung von UTF8-codierten Zeichen bei Verwendung von json_encode chinesische verstümmelte Zeichen angezeigt werden. Die Lösung besteht darin, die Zeichen mit der Funktion urlencode() zu verarbeiten, bevor Sie json_encode und dann json_encode verwenden, und sie bei der Ausgabe des Ergebnisses mit der Funktion urldecode() zurückzukonvertieren. Die Details lauten wie folgt:

<?php
 $testJSON=array(&#39;name&#39;=>&#39;中文字符串&#39;,&#39;value&#39;=>&#39;test&#39;);
 //echo json_encode($testJSON);
 foreach ( $testJSON as $key => $value ) {
  $testJSON[$key] = urlencode ( $value );
 }
 echo urldecode ( json_encode ( $testJSON ) );
?>

Ausgabeergebnis anzeigen:

{"name": "Chinesische Zeichenfolge", "Wert". ": "test"🎜>

Zu diesem Zeitpunkt werden chinesische Schriftzeichen erfolgreich ausgegeben. Fühlen Sie sich frei, json_encode zu verwenden. Auf diese Weise erscheint die im PHP-Hintergrund ausgegebene JSON-Zeichenfolge nicht verstümmelt auf Chinesisch, wenn eval von Ajax im Front-End-Javascript empfangen wird, da js auch Daten im JSON-Format in Form von UTF8 verarbeitet, was PHP ähnlich ist Es empfängt die PHP-Seite. Der JSON-String verursacht keine Probleme.

Ausführlichere Erläuterungen zur PHP-Funktion json_encode() und Artikel zu chinesischen verstümmelten Zeichen finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn