ホームページ  >  記事  >  バックエンド開発  >  PHPで漢字が文字化けする問題を解決する方法

PHPで漢字が文字化けする問題を解決する方法

藏色散人
藏色散人オリジナル
2020-07-11 09:11:043212ブラウズ

php の中国語文字化けの解決策: 1. mysql 設定ファイル「my.ini」または「my.cnf」を変更します; 2. 必要な PHP プログラムの前にステートメント「mysql_query("set」を追加します)データベース操作を実行するには names 'encoding'");"; 3. サーバーのエンコーディング セットを「UTF-8」に設定します。

PHPで漢字が文字化けする問題を解決する方法

# PHP における中国語文字化けの原因と解決策の分析

PHP Web ページのエンコード

1. gb2312 エンコーディングを使用する場合、PHP はヘッダー ("Content-type:text/html;charset=gb2312"); を出力し、静的ページを追加し、すべてのファイルのエンコーディング形式は ANSI です。 、メモ帳で開き、ANSI にエンコードされた選択項目として保存し、ソース ファイルを上書きします。

2. utf-8 エンコーディングを使用したい場合、php はヘッダーを出力する必要があります: header("Content-type:text/html;charset=utf-8");、静的ページを追加し、すべてのファイルをエンコードします。形式は utf-8 です。 utf-8 で保存するのは少し面倒かもしれません。通常、utf-8 ファイルは先頭に BOM が付いています。セッションを使用すると問題が発生します。editplus を使用して保存できます。editplus で [ツール] -> [編集] に移動します。パラメータの選択 -> ファイル -> UTF-8 署名で、常に削除を選択し、保存して BOM 情報を削除します。

3.php 自体は Unicode ではないため、substr などのすべての関数を mb_substr に変更するか (mbstring 拡張機能をインストールする必要があります)、または iconv を使用してトランスコードする必要があります。

PHP と Mysql の間のデータ対話

PHP とデータベースのエンコーディングは一貫している必要があります

1. mysql 設定ファイル my.ini または my.cnf、mysql を変更します。 utf -8 Encoding

[mysql]  
default-character-set=utf8 
[mysqld]  
default-character-set=utf8 
default-storage-engine=MyISAM 
在[mysqld]下加入:  
default-collation=utf8_bin 
init_connect='SET NAMES utf8'

2 を使用するのが最善です。データベース操作を実行する必要がある PHP プログラムの前に、mysql_query("set names 'encoding'"); を追加します。エンコーディングは PHP エンコーディングと一致します。 PHP エンコーディングが gb2312 である場合、mysql エンコーディングは gb2312 です。utf-8 の場合、mysql エンコーディングは utf8 であるため、データの挿入または取得時に PHP で中国語の文字化けが発生することはありません。

エンコードについて

1. 文字セット:

コンピュータの最下層に保存されているデータはすべてバイナリデータです。本当に意味のある文字を取得したい場合は、バイナリを使用する必要があります。 データは各文字に対応しており、この対応によりコーディング テーブルが形成されます。

一般的に使用される文字セット:

ISO-8859-1 西ヨーロッパ言語を表すラテン語コード テーブル latin は、1 バイトまたは 8 ビットを使用してデータを表します。

GB2312 簡体字中国語コード表。 6000 ~ 7000 の漢字と記号が含まれています。 2バイトで表現されます。どちらのバイトも 1 で始まり、両方とも負の数です。

GBK は現在最も一般的に使用されている中国語コード テーブルで、20,000 の中国語の文字と記号が含まれています。データを表すには 2 バイトを使用します。

Unicode 国際標準コードは、それがどのようなテキストであっても、2 バイトで格納されます。

UTF-8 は Unicode に基づいています。データは 2 バイトではなく 1 バイトに保存できます。さらに、このコード テーブルはより標準化されており、各バイト ヘッダーにエンコード情報が追加されています。

(Linux はデフォルトで ISO-8859-1 を使用し、win32 はデフォルトで GB2312 を使用します)

2. エンコードとデコード

エンコード: 文字を文字内の対応する文字に変換します。 set Encoding

Decoding: 文字セット内のエンコーディングに対応する文字を検索します

ネットワーク内での中国語の送信プロセス

1. Java を例にとると、Eclipse は以下を使用します。 UTF-8 エンコード セット、Tomcat サーバーはデフォルトで ISO-8859-1 エンコード セットを使用し、ブラウザは一般にデフォルトで GBK エンコード セットを使用します。

文字はプログラムとサーバーの間で送信され、バイトはサーバーとブラウザの間で送信されます。

2. 中国語の送信プロセス:

ブラウザ内の中国語文字 -----> エンコード -----> サーバー -----> デコード --- -->プログラム;

プログラム内の漢字----->サーバー----->デコード----->ブラウザ---- ->エンコード表示

3. 文字化けの原因と解決策:

(1). ブラウザ内の漢字は GBK でエンコードされ、バイト ストリームでサーバーに送信され、サーバーはそれをデコードします。 ISO-8859-1 を取得し、文字の形式でプログラムに送信します。

ISO-8859-1 エンコード セットは中国語の文字をサポートしていないため、デコードされた文字はすべて西ヨーロッパ文字です。これらの文字をプログラムに送信すると文字化けが発生します。

このため、サーバーのエンコード設定を UTF-8:

request.setCharacterEncoding("UTF-8");

に設定するだけですが、この設定はリクエスト本文の内容にのみ影響するため、このメソッドは POST リクエスト メソッドにのみ使用できます。GET リクエスト メソッドの場合は、デコードしてからエンコードする方法を使用できます:

byte[] buffer = request.getParameter("word").getBytes("ISO-8859-1");  //进行编码
String newStr = new String(buffer,"UTF-8");  //进行解码

(2). プログラム内の漢字はそのままサーバーに送信されます. サーバーはまず漢字をエンコードしてから送信する必要がありますブラウザに送信されますが、ISO-8859-1 のエンコード セットが中国語の文字をサポートしていないため、対応するエンコードが文字セット内に見つかりません。エンコード後は疑問符になり、ブラウザに送信されて表示されます。 ;

この場合、設定を 2 回行う必要があります:

response.setCharacterEncoding("UTF-8");//将服务器编码集设置为UTF-8
response.setContentType("text/html;charset=UTF-8"); //将浏览器编码集设置为UTF-8

実際、設定の 2 行目にはすでにサーバーの設定が含まれているため、通常は次のように記述するだけで済みます。コードの 2 番目の文。

関連知識の詳細については、

PHP 中国語 Web サイト をご覧ください。

以上がPHPで漢字が文字化けする問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。