TOTAL:2776, TODAY:542

玄箱WEBサーバのUTF-8化

掲示板を作成するために、MySQLを使用しようとしたら、やはり文字化けが発生していたので、玄箱WEBサーバのLAMP(Apache2.0、PHP4、MySQL4.1)を完全にUTF-8化しました。これまで、漢字コードはいい加減な設定でしたが、これを機にすべて修正しました。UTF-8に統一した理由は、もともと玄箱Debianの漢字コードをUTF-8に設定したためです。EUCでも良かったのですが、これからはUTF-8かな?と思ったからです。で、私の環境ですが、次の通りです。2007年5月現在、aptitudeで取得できる安定版の最新バージョンのはずです。

  • Debian Sarge/ Kernel 2.6.20 ※270氏作成のもの
  • Apache 2.0.54
  • php 4.3.10
  • MySQL 4.1.11
  • phpMyAdmin 2.6.2

Windows用XAMPPと各ソフトのバージョンは違いますが、変更した内容は、「Windows用XAMPPのUTF-8化」とほとんど同じです。

PHPの設定(php.ini)

まず、php.iniの修正です。このファイルは、/etc/php4/apache2の下にあります。「PHPも入れてみる」を書いた頃は、何も分かっておらず、default_charsetだけEUC-JPにしていましたが、これらを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
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
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 accoding 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 = Off
mbstring.encoding_translation = On        <- 内部エンコードに従って変換

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

; substitute_character used when character cannot be converted
; one from another
;mbstring.substitute_character = none;
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系の関数オーバーロードなし

この後、次のコマンドでApache2を再起動します。

/etc/init.d/apache2 restart

そして、次のことが書かれたphpinfo.phpというファイルをhttp://玄箱のIPアドレス/phpinfo.phpでアクセスします。

<?php phpinfo() ?>

すると、上で設定した内容が反映されているはずです。

この辺りは、釣ったよ!さんのページに分かりやすく書いてあります。私は、そのページにあるテスト用のスクリプト(phpファイル)をUTF-8に変換して試しました。もちろん、上の設定で正しく動いていることを確認しました。

MySQLの設定(my.cnf)

玄箱のMySQLもv4.1以上なので、XAMPPの設定同様、文字コードに関係する環境変数がたくさんあります。但し、XAMPPと違って、/etc/mysql/my.cnfだけですんなり設定できました。追加・変更したのは次の通りです。

[client] 
default-character-set = utf8

[mysqld] 
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を再起動します。

# /etc/init.d/mysql restart

正しく動作するかの確認ですが、次のように、MySQLコマンドで、各変数が設定されていれば、OKです。

# mysql -u root -p
Enter password:
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

mysql> show variables like 'coll%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

mysql>

また、手元にMySQLのダンプファイル(EUC-JP形式)があったので、これをUTF-8に変換し、ファイルdump_utf8.txtとしてを読み込ませ、select命令で、文字化けせずに表示されることを確認しました。

#mysql -u root -p <データベース名> < dump_utf8.txt
Enter password:
mysql> use <データベース名>;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from <テーブル名>;

***** ここに、日本語のデータベースが表示される ****

mysql>

phpMyAdminの設定(config.inc.php)

玄箱のphpMyAdminの設定ファイルは、/etc/phpmyadmin./config.inc.phpですが、XAMPPのような設定箇所がなかったので、特に何も変更しませんでした。それでも、問題なく日本語のデータベースの作成、検索、表示ができました。

ホームページビルダーのための設定

結局、一番ハマッタのがホームページビルダーv11(以後、HPB)の編集画面でうまく表示させるための設定でした。まず、UTF-8に移行するために、全ページをUTF-8、改行はLFに変換し、次のように<meta>タグをUTF-8に変更しました。

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

この後気付いたのですが、SJISとUTF-8では、同じマシン(WindowsXP)、同じブラウザ(IE6)で見ても、欧米フォントが異なることに気付きました。なんじゃそりゃ?です。ネットで調べると、同じような人がたくさんいて、解決策としては、次のようなfont-familyを設定すればいいのですが、スタイルシートファイル*.cssに設定しても、HPBがうまく読み取ってくれませんでした。

body{
  font-family : "MS Pゴシック",sans-serif;
}

編集画面の文字がカッコ悪いフォントになり、文字幅もブラウザで見たときと大きく変わってしまいました。HPBの一番の利点はWYSIWYGなので、これでは台無しです。もしかしたら、UTF-8に変えたので、日本語名フォントがよくないのかな?と思い、次のような英語表記にしましたが、これも駄目でした。

body{
  font-family : "MS PGothic",sans-serif;
}

どうやら、HPBはスタイルシートにあるfont-familyをうまく読み取ってくれないようです。悩んだ挙句、結局、全ファイルに次のようなスタイルを埋め込むことで、うまくいきました。

<style type="text/css">
<!-- DIV{font-family : "MS Pゴシック",sans-serif;} -->
</style>

う~ん。ほとんどスタイルシートの意味ないじゃん!IBMさん、なんとかして。そもそも、漢字コードが違うだけで、表示が違ってしまうIEも何とかしてほしいです、マイクロソフトさん。最後は愚痴になってしまいましたが、これで完全にUTF-8に移行できました。一応、Fedora6のFireFoxでも確認しましたが、これまで通り文字化けせずに表示されているので、大丈夫だと思います。

最新の7件

OpenGL

電子工作

玄箱HG

ホームページ

日記

Copyright (C) 2007 Arakin , All rights reserved.