この記事では、PHP 配列を JavaScript と json_encode に渡すときに発生する gbk 中国語の文字化けの解決策を紹介します。以下は、JSON 関数の作成です。この段落は、インターネット上の某ヒーローからのものです。
コードは次のとおりです
| コードをコピー
|
/*************************************************** * **********
*
* 特定の関数を使用して配列内のすべての要素を処理します
* @param string &$array 処理対象の文字列
* @param string $function 実行する関数
* @return boolean $apply_to_keys_only キーにも適用するかどうか
* @アクセス公開
*
************************************************* * ***********/
function arrayRecursive(&$array, $function, $apply_to_keys_only = false)
{
foreach ($array as $key => $value) {
If (is_array($value)) {
arrayRecursive($array[$key], $function, $apply_to_keys_only);
} else {
$array[$key] = $function($value);
}
if ($apply_to_keys_only && is_string($key)) {
$new_key = $function($key);
If ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
}
/*************************************************** * **********
*
* 配列を JSON 文字列に変換します (中国語と互換性があります)
* @param array $array 変換する配列
* @return string 変換されたjson文字列
* @アクセス公開
*
************************************************* * ***********/
関数 JSON($array) {
arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
urldecode($json)を返します;
}
|
データベースに接続し、配列 $array1 の値を取得します
コードは次のとおりです
| コードをコピー
|
$dbcnx = @mysql_connect ( "localhost", "root", "1234" );
if (! $dbcnx) {
echo (「現時点ではデータベース サーバーに接続できません。」);
終了 ();
}
if (! @mysql_select_db ( "pms" )) {
echo ("現時点ではジョーク " . "データベースが見つかりません。");
終了 ();
}
mysql_query ( "SET NAMES 'GB2312'" );
$q=mysql_query("ALV = 1 の能力から * を選択");
While($row=mysql_fetch_array($q)){
$array1[] = $row[AName];
}
|
配列array1がJavaScriptに配列ability1に渡されます
コードは次のとおりです |
コードをコピー |
<スクリプトタイプ="text/javascript">
varability1=;
var a=eval("能力1");
アラート(a[0]);
スクリプト>
|
JSON中国語文字化けコードに対する別の解決策
中国語の場合は注意してください
オンラインで解決策を見つけました:
コードは次のとおりです |
コードをコピー |
/* json_encode の中国語文字化けを処理します */
$data = array ('game' => '火と氷の国', 'name' => '茨の精霊', 'country' => '霜の国', 'level' => );
エコー json_encode ( $data );
エコー「 」;
$newData = 配列 ();
foreach ( $data as $key => $value ) {
$newData [$key] = urlencode ( $value );
}
echo urldecode ( json_encode ( $newData ) );
?>
後で他の人にアドバイスを求めたところ、base64エンコーディングも使用できますが、Baiduは次のように説明しました。
| 標準 Base64 は、URL での直接送信には適していません。これは、URL エンコーダーが標準 Base64 の「/」と「+」文字を「%XX」の形式に変更し、これらの「%」文字が保存時に含まれるためです。 ANSI SQL では「%」記号がワイルドカード文字として使用されているため、データベースに変換する必要があります。
ただし、私のデータは POST 経由で送信され、HTTP ヘッドではなくメッセージ本文にあるため、影響を受けません。
json_encode は utf-8 形式のデータのみを受け入れることができます
例: json_encode 処理後、「Xu」は「u80e5」になり、最終的な json の中国語部分は Unicode エンコーディングに置き換えられます。私たちが解決しなければならないのは、オブジェクトを json に変換し、オブジェクト内の中国語が json 内で通常の中国語として表示されるようにすることです。json_encode を使用するだけでは目標を達成できないようです。
私の解決策:最初にクラス内の中国語フィールドをURLエンコード(urlencode)し、次にオブジェクトをJSONエンコード(jsonencode)し、最後にJSON、つまり最後のJSONをURLデコード(urldecode)します。内部の中国語は依然として同じ中国語です!
テストコードは次のとおりです:
コードは次のとおりです
コードをコピー
|
クラス myClass { |
パブリック $item1 = 1;
パブリック $item2 = '中国語';
関数 to_json() {
//URL エンコード、中国語を Unicode に変換する json_encode を回避します
$this->item2 = urlencode($this->item2);
$str_json = json_encode($this);
// URL をデコードし、オブジェクト属性が変更されないように JSON に変換した後に各属性を返します
$this->item2 = urldecode($this->item2);
urldecode($str_json)を返します
}
}
$c = 新しい myClass();
エコー json_encode($c);
エコー ' ';
エコー $c->to_json();
エコー ' ';
エコー json_encode($c);
エコー ' ';
echo json_encode('襥');
?>
プログラム出力結果:
{"アイテム1":1,"アイテム2":"u4e2du6587"}
{"item1":1,"item2":"中文"}
{"アイテム1":1,"アイテム2":"u4e2du6587"}
「u80e5」
メモは http://www.bKjia.c0m/phper/php/42865.htm でご覧いただけます
http://www.bkjia.com/PHPjc/632186.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632186.html技術記事この記事では、PHP 配列によって JavaScript と json_encode に渡される gbk 中国語の文字化けコードの解決策を紹介しています。この段落は、インターネット上のヒーローのコードから来ており、次のようにコピーされています。
|