XAMPPでUTF-8ベースで使う場合 [#e507cdba]

最近は、Xoops Cube やJoomlaなどUTF-8の環境で動くphpスクリプトがおおいので、この場合の文字化け対策を調べてみた。

my.confの設定:MySQL4.1系UTF-8の場合

MySQL4.1系ではデフォルトでUTF-8文字列が使われます。 PHPから普通にデータ挿入をしようとすると、文字化けします。

SQL文を発行するまえに、クライアントの文字コード設定をしましょう。 文字コードの設定は次の構文で行います。

mysql> SET NAMES utf8

毎回スクリプト側にて行うのが面倒だ、という方はmy.cnfに次のように記述します。 (XAMPPの場合は、C:\Program Files\xampp\mysql\bin以下にmy.cnfが存在)

[mysqld]
init-connect=SET NAMES utf8

XAMPP(v1.5.1時点)を使っている場合、このオプション(init-connect)が効かないので、 C:\Program Files\xampp\mysql_start.batを開きmysqldの起動オプションに、 「--init-connect="SET NAMES ujis"」を書き加えてください。

mysql\bin\mysqld --defaults-file=mysql\bin\my.cnf --init-connect="SET NAMES ujis" --standalone

これでも文字化けする、という方はmy.cnfの設定を確認します。次のように、サーバ側の文字コードがUTF-8になっているか確認します。

[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
  • [mysqld]の設定の解説:1 行目でデフォルトの文字コードを指定し、2行目は「余計なことはするな」という命令。(MySQL4.1.5で実装)。これによってサーバとクライアントの文字コードが違っていても内部変換をしなくなる。余計なものを実装して、その余計なものを抑止するオプションを実装してくれたMySQLに乾杯!設定は上記のように "mysqld" セクションだけでOK。サーバの設定を変更したので、MySQLは忘れずに再起動しておく。
  • 設定ファイルに元々記載されている「character-set-server = latin1」と「collation-server = latin1_general_ci」をコメントアウトして、代わりに上記2行を追加すると、めでたく「SET NAMES」なしでも文字化けを回避できました!
#character-set-server = latin1 ←コメントアウト
#collation-server = latin1_general_ci ←コメントアウト
character-set-server = utf8 ←追加
collation-server = utf8_general_ci ←追加
skip-character-set-client-handshake ←追加

PHPMyAdminの文字化け

phpMyAdminで作成したテーブルの照合順序をLatin1~からutf8_unicode_ciに変更する。

  • phpMyAdmin画面で、左側のフレームよりテーブルを選択した後、右側の画面の上にある「操作」を押すと、テーブルのオプションで照合順序などもろもろ変更することができます。

呼び出すPHP側で文字コードの指定することにより解決する。 SQLからデータを呼び出すphpの中で以下の命令をSQLに送信。

$sql = "SET NAMES sjis"; // SET CHARACTER SET SJISでも確認できました
$result = mysql_query($sql);

php.iniの修正

php.ini の下記をコメントをとり、有効にする。

masic_quotes_gpc = Off
date.timezone = Asia/Tokyo
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.http_input = auto
mbstring.http_output = auto
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII

phpスクリプトの修正

UTF-8で出力したいページに関係あるPHPファイルのうち、日本語を含むものを、すべてUTF-8で文字符号化します。その上でheader()にUTF-8を出力するのが、手間はかかりますが、もっとも簡単な方法です。

$mail_header = "Content-Type: text/plain;charset=\"UTF-8\"";

Terapadや秀丸といったエディタは、文字符号化を変更する機能を備えているので、そういったエディタを利用してみてください。

例えばですが、http://localhost/でリダイレクトされたhttp://localhost/xampp/は、ブラウザはSHIFT_JISで認識して表示しています。/htdocs/xampp内で日本語を使っているファイルは、/htdocs/xampp/lang/jp.phpなので(ひょっとしたら他にもあるかも。。。)、このファイルをエディタでUTF-8に変換して保存します。header()は/htdocs/langsettings.phpで出力しているようなので、ここでUTF-8を出力するように修正します。そうするとブラウザがUTF-8で表示するようになると思います。

基礎知識

  • 日本語環境の設定 標準のキャラクターセットが日本語になっていないバイナリを使用するときは、設定をしておきます。
[mysqld]
default-character-set = ujis
[mysqldump]
default-character-set = ujis
[mysql]
default-character-set = ujis
  • 、language = の指定は、日本語が扱える、扱えないには、全く関係ありません。設定しても無意味。たんにエラーメッセージが日本語になるだけで、クエリやデータを日本語扱いにするという意味ではありません。 エラーメッセージが日本語になっても邪魔くさい(変な文だし、文字化けするかも)ので、通常は language は指定しません。また、全てのアプリが my.cnf を読むわけではありません。勘違いしないように。my.cnf を読むのは、原則、MySQL 付属のコマンドだけと思ってください。
  • 自分の状態を知るための SQL 文
    SHOW VARIABLES LIKE 'char%';
    • サーバーとクライアントのキャラクターセットが同じ場合は、文字の自動変換は起きず、文字化けは発生しない。
    • クライアントが binary の場合は、文字の自動変換は起きない。文字化けは発生しない。
    • クライアントが latin1 で、サーバーが日本語の場合は、確実に文字が壊れる。
    • クライアントとサーバーがマルチバイトキャラクターセットだが、違うキャラクターセットの場合、幾つかの文字は破壊されるかもしれない。
  • MySQL 4.1以上の文字化けの問題
    •文字コードの自動変換機能が追加された。
    •mysqldump の標準キャラクターセットがどうコンパイルしても utf8 になる
    •データベース、テーブル、フィールド、それぞれ個別にキャラクターセットを指定できるようになった。
    •データベース名、テーブル名は、OS 上では unicode に直されて保存されるように変わった
    (ディレクトリ名、ファイル名が、utf8 キャラクターセットで書かれるようになった)。
    4.0 まではバイナリ列がそのままデータベース名(=ディレクトリ名)、テーブル名(=ファイル名)になっていた。
    • 4.1 になってから、サーバー、クライアントがそれぞれのキャラクターセットで動作するようになりました。例えば、クライアントが sjis で動作,•サーバーが ujis で動作 している場合、サーバーは、クライアントに対しては常に sjis のデータを送るようになります。サーバーは ujis のデータを sjis に変換して、クライアントに送るのです。
    • 例えば、クライアントが latin1 で動作,サーバーが sjis で動作の場合、どうやって sjis を latin1 の文字コードに変換できるというのでしょう?出来るわけがないので、sjis 文字はあえなく全て ? になってしまいます。
  • これらの問題を避ける方法は
  • PHP(Ruby,Perl,C,...)のアプリの変更。キャラクターセットを mysql_options()で指定する or アプリがmy.cnf を読むようにする
  • PHP(Ruby,Perl,C,...)の MySQL モジュールの標準キャラクターセットを、自分が使うキャラクターセットにする。これはアプリの変更はない。しかしlibmysql.dll,libmysqlclient のコンパイルし直しが発生する。
  • mysqldump の仕様変更の弊害(文字化け)
    • 4.1 からは、mysqldump はコンパイル時のキャラクターセットを無視して、utf8 を標準とします.サーバーが ujis, sjis で動いていたとしても、utf8 に変換して dump します。utf8 はご存じの通り、到底整理されているコードとは言い難く、そのため、dump した内容が壊れる可能性が高いです。これを避けるためには、mysqldump を実行するとき、必ず default-character-set オプションを指定すべきです。
  • 対策
    • •MySQL 5.0.13-rc 以上の場合、mysqld に skip-character-set-client-handshake オプションを指定する。ただしこのオプションを使う場合は、データの文字コード、テーブル,データベースの文字コード、mysqldの文字コード、クライアントの文字コードの全てが同一である場合に限る。
    • •mysqldump には必ず --default-character-set= を指定すること。
    • •MySQL サーバーとクライアントは、必ず同じキャラクターセットにしておくこと。
    • •4.1以上対応のアプリケーションには、必ず、mysql_options()でキャラクターセットを指定するようなコーディングをするか、my.cnfを読むようなコーディングにする。"SET NAMES" よりはこの対応の方が良い。
    • •データベース名、テーブル名、フィールド名には、マルチバイト文字は使用しないこと。
    • •マルチバイトキャラクターセットと、latin1などのシングルバイトキャラクターセットを混在させないようにすること

XAMPP メール送信の日本語が文字化け

XAMPP 1.7.1のメール送信日本語化についての設定手順です。 php,iniで下記ならば、文字化けしない

mbstring.language = Japanese
mbstring.internal_encoding = SJIS
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
mbstring.func_overload = 0

次に C:\xampp\apache\conf\extra\httpd-languages.conf を修正

DefaultLanguage ja    ←修正します。
AddCharset shift_jis .shift_jis .sjis
AddDefaultCharset shift_jis    ←追加します。
  • UTFで運用したい場合はどうする???。
    • 【mail.php】【mail.html】ですが
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
mb_convert_encoding($message,"JIS","UTF-8"),$header)
↑本文の文字コードをUTF-8からjisに変換していますが
$header = "Content-Type: text/plain; charset=UTF-8\n";
↑ヘッダーはUTF-8のままです。
  • 文字化け対策に
    SMTP = localhost を SMTP = ****@****.** へ変更
    mbstring.language = Japanese
    mbstring.internal_encoding = EUC-JP
    
    ; http input encoding.
    mbstring.http_input = auto を
    mbstring.internal_encoding = UTF-8
    ; http input encoding.
    mbstring.http_input = UTF-8
    mbstring.http_output = pass
    mbstring.encoding_translation = Off
    mbstring.detect_order = auto 
    で、文字化けも無く送信できるようになりました。

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-08-19 (日) 07:58:00 (2286d)