TOTAL:952, TODAY:99

Windows用XAMPPのUTF-8化

玄箱WEBサーバの確認用であるXAMPPをUTF-8ベースに変更しました。ネットで調べながら、試行錯誤してようやくできましたので、紹介します。恐らく、XAMPPのバージョンが違うと、多少違ってくるかもしれませんので、適宜参考にしてください。私の環境は、OSがWindowsXPで、2007年5月現在の最新版XAMPP1.6.1を使用しています。主なソフトのバージョンは、次の通りです。

  • Apache 2.2.4
  • PHP 5.2.1
  • MySQL 5.0.37
  • phpMyAdmin 2.10.02

PHPの設定(php.ini)

まず、php.iniの修正です。このファイルは、デフォルトではC:\xampp\apache\binにあります。「Windows用XAMPP導入」のページでは、EUC-JPやSJISを設定していましたが、これらをUTF-8に入れ替えます。

output_buffering = Off                 <- 文字コードを統一するならOff

    :   : 途中略 :   :

; PHP's built-in default is text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"
default_charset = "UTF-8"              <- PHPがhtmlに出力するヘッダコード

    :   : 途中略 :   :

[mbstring]
; language for internal character representation.
mbstring.language = Japanese              <- 日本語

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
;;;mbstring.internal_encoding = EUC-JP
mbstring.internal_encoding = UTF-8        <- 内部コードをUTF-8

; http input encoding.
mbstring.http_input = auto                <- 入力を自動判定

; http output encoding. mb_output_handler must be
; registered as output buffer to function
;;;mbstring.http_output = SJIS
mbstring.http_output = UTF-8              <- 出力をUTF-8

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
;       portable libs/applications.
mbstring.encoding_translation = On        <- 内部エンコードに従って変換

; automatic encoding detection order.
; auto means
mbstring.detect_order = auto              <- 判定順はオート

; substitute_character used when character cannot be converted
; one from another
mbstring.substitute_character = none;     <- 変換できないと時の振る舞い

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
mbstring.func_overload = 0                <- mb系の関数オーバーロードなし

この後、XAMPPコントロールパネルによりApacheを再起動します。そして、XAMPPのローカルホームページ(http://localhost/xampp)の左側にあるphpinfoをクリックし、PHPの環境変数を確認します。例えば、上で設定したmbstringは次のようになっているはずです。

default_charsetも同様にUTF-8であることを確認できます。今回は、C:\xampp\apache\binの下にあるphp.iniを変更しましたが、PHP4に切り替えたりする場合は、C:\xampp\php\php.iniも変えたほうがよいみたです。但し、C:\xampp\phpの下には、それらしいファイルがたくさんあるので、何が何やらよう分かりませんけど。。。。

MySQLの設定(my.cnf)

次は、MySQLの設定です。MySQLはv4.1から文字コードに関係する環境変数が大幅に強化されたようです。そのため、たくさんの変数を変える必要があります。修正するのは、C:\xampp\mysql\bin\my.cnfです。cnfという拡張子は、短縮ダイヤルのファイルとみなされるらしく紛らわしいので、気をつけてください。my.cnfには、[clien]、[mysqld]など、MySQLの機能や操作ごとにいろいろ文字コードを設定できるのですが、全部UTF-8系に変えてしまいます。結局、追加、変更したのは次の通りです。

[client] 
default-character-set = utf8

[mysqld] 
##character-set-server = latin1
##collation-server = latin1_general_ci
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init-connect=SET NAMES utf8

skip-character-set-client-handshake

[mysqldump] 
default-character-set = utf8

[mysql] 
default-character-set = utf8

この中で、skip-charcter-set-client-handshakeは、MySQLクライアントなどの文字コードをMySQLサーバ(mysqld)で設定した文字コードに、無理やり統一するものです。私の環境では、skip-character-set-client-handshakeを記述しないと、character set client等の一部の変数がLatin1(欧米か!)のままで、UTF-8になりませんでした。理由は分かりません。この辺りのMySQL文字コードに関する設定は、次のホームページにも詳しく載っていますので、参考にしてください。

MySQLAdminの設定(my.ini)

上で述べたmy.cnfで、skip-character-set-client-handshakeを記述したならば、やる必要はないですが、クライアントの文字コード「character set client」の設定はmy.iniファイルで行うことができましたので、簡単に紹介します。my.iniは、XAMPPコントロールパネルのMySQLの管理ツールから編集することができますが、ファイル自体はC:\WINDOWS\my.iniですので、これを直接編集しても構いません。私の場合、次のように追加すると、「character set client」もUTF-8にすることができました。

[WinMySQLAdmin]
Server=c:/xampp/mysql/bin/mysqld-nt.exe

[client]                          <- 追加
default-character-set=utf8        <- 追加

このmy.iniですが、一応、winmysqladmin.exeの設定ファイルのようです。my.iniかmy.cnfのいずれかに設定すればいいようなのですが、[clien]に関しては、なぜかmy.iniでしかうまく設定できませんでした。

phpMyAdminの設定(config.inc.php)

MySQLで日本語のデータを正しく格納、表示できるかを確認するために、phpMyAdminも設定します。Windowsの場合、DOS窓のMySQLコマンドで確認しようとすると、SJISしかまともに表示してくれませんので、phpMyAdminを使います。設定は、C:\xampp\phpMyAdmin\config.inc.phpで、次のようにします。

/**
 * Language and charset conversion settings
 */
// Default language to use, if not browser-defined or user-defined
$cfg['DefaultLang'] = 'en-utf-8';          <- 最初からこうなっていた

// Force: always use this language - must be defined in
//        libraries/select_lang.lib.php
// $cfg['Lang']     = 'en-utf-8';

// Regullar expression to limit listed languages, eg. ...
// English only
$cfg['FilterLanguages'] = '';              <- 最初からこうなっていた

// Default charset to use for recoding of MySQL queries, does not take
// any effect when charsets recoding is switched off by
// $cfg['AllowAnywhereRecoding'] or in language file
// (see $cfg['AvailableCharsets'] to possible choices, you can ...
//$cfg['DefaultCharset'] = 'iso-8859-1';   <- コメントアウト
$cfg['DefaultCharset'] = 'utf-8';          <- 追加
$cfg['DefaultConnectionCollation'] = 'utf8_general_ci';     <- 追加

実際に変更/追加したのは、$cfg['DefaultCharset']$cfg['DefaultConnectionCollation']だけです。この後、XAMPPのコントロールパネルでMySQLやApacheを再起動し、phpMyAdminで環境変数を見ると、次のようになりました。

どうやら、config.inc.phpに設定した$cfg['DefaultConnectionCollation']は、全然効果がないみたいで、utf8_unicode_ciがデフォルトになってしまいます。一応、phpMyAdminの先頭ページにある「MySQLの接続照合順序」をutf8_general_ciに変更すれば、完全に一致させることができます。phpMyAdminで次のような日本語のデータベースをテスト的に作成しましたが、utf8_unicode_ciのままでも特に問題なく検索や表示ができたので、放置しています。実際、私には、utf8_unicode_ciとutf8_general_ciの違いはよく分かっていません。。。。

<meta>タグの設定

サーバ側の設定はほぼ完了したので、全ページをUTF-8、改行はLFに変換しました。私は、普段ホームページビルダー(以後、HPB)を使用しており、これは、デフォルトで、次のような<meta>タグを出力します。

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

これまで、SHIFT-JISで編集していたため、charsetがShift_JISになっています。そのため、次のように、Shift_JISの部分をUTF-8に変更します。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

こうしないと、HPBで読み込むときに文字化けしてしまいます。この辺りの文字コードや改行の設定、<meta>タグ出力のオンオフ等は、HPBの「ツール」→「オプション」→「ファイル」で変更できます。私の場合、改行は「LF」、出力漢字コードは「UTF-8」にしました。
長い説明でしたが、これで終わりです。玄箱の環境も、UTF-8に統一したので、それも次に紹介する予定です。

最新の7件

OpenGL

電子工作

玄箱HG

ホームページ

日記

Copyright (C) 2007 Arakin , All rights reserved.