英語と日本語の共存。
言葉で言えばひとことですが、プログラム的にはこれは結構な壁だったりします。
これがうまくいっていないことで、あちこちで文字化けが起こったり、なんてのはよくあること。
今回、ワタクシのところではDBのGUIツールが化けました。
てことで、今後起こらないようにするためにも、対策をいろいろと講じてみようかと思います。
文字化けの原因は煎じ詰めていけば、「文字コードの相違」から始まります。
Railsの場合、「UTF-8」がベースになるので、基本的にはすべてがコレになればいいわけですね。
1. environment.rbの設定
まずは【environmen.rb】から。
1行目にこんな文言を追加します。
-
$KCODE = "UTF8"
Rubyでは、「$KCODE」というグローバル変数で文字コードの設定を行うため。
2. application.rbの設定
次に【application.rb】。
こんな感じで、処理の最初に必ず文字コードのフィルターをかけるようにします。
-
class ApplicationController <ActionController::Base
-
# 日本語化処理
-
before_filter :set_charset
-
-
private
-
def set_charset
-
headers["Content-Type"] = "text/html; charset=UTF-8"
-
end
-
end
ここまでで、アプリ側のエンコードはOKのはず。
3.database.ymlの設定
続いて、DBまわりのこと。
【database.yml】で、「encoding」を指定します。
-
development:
-
adapter: mysql
-
database: dummytunes-development
-
username: dummytunes
-
password: dummytunes
-
host: localhost
-
encoding: utf8
4. MySQLサーバー側の設定
さらに、DBのサーバー側の設定。バージョンは4.1(5.0だとうまくいかなかった)。
こちらはコマンドラインから。
個人的に使ったコマンドは以下(順序もそのまま)。
- show databases;
- use dummytunes-development;
- show tables;
- show variables like "char%";
→スキーマのリストを表示。
→使うスキーマを選択。use ○○という感じで。
→スキーマの中にあるテーブルのリストを表示。
→charで始まるスキーマの変数を取得。
たぶん、最後のを使うと、「latin1」という文字コードばかりが並ぶはず。
これが悪いことをする可能性が高いので、2箇所直します。
まず、MySQLAdministratorからView > Startup Variables > AdvancedのDef. Char Setにチェックを入れて、「utf8」に変えます。
次に、先ほどのコマンドラインから、「set names utf8;」と入力し、最終的にこんな感じになればカンペキ。
-
mysql> SET names utf8;
-
Query OK, 0 rows affected (0.01 sec)
-
-
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 | C:\Program Files\MySQL\MySQL Server 4.1\share\charsets/ |
-
+--------------------------+---------------------------------------------------------+
-
7 rows in SET (0.02 sec)
もし、それでも一部おかしかったら、スキーマを一回作り直してみるのも手かもしれませんね(乱暴)。
5. DDL関連
たぶん、これで大体大丈夫だとは思いますが、念には念を、ということで、DDLにも手を加えておきます。ポイントは一番下の行。
-
CREATE TABLE `categories` (
-
`id` INTEGER UNSIGNED NOT NULL DEFAULT NULL AUTO_INCREMENT,
-
`name` VARCHAR(50) NOT NULL,
-
PRIMARY KEY (`id`)
-
)
-
ENGINE = INNODB
-
CHARACTER SET utf8 COLLATE utf8_general_ci;
CHARACTER SETでもutf8を指定しておけば、テーブル単体の文字コードも設定できるので、ついでにやってみます。
長くなってしまいましたが、文字化け対策って、これくらい厳重にやってやっと、というものが多いように思います。
やっておいて損はないことなので、機を見てしっかりやっておくといいですね。
Via:

0 Responses to “文字化け対策のためのあれこれ”