文字化け対策のためのあれこれ

英語と日本語の共存。
言葉で言えばひとことですが、プログラム的にはこれは結構な壁だったりします。
これがうまくいっていないことで、あちこちで文字化けが起こったり、なんてのはよくあること。
今回、ワタクシのところではDBのGUIツールが化けました。
てことで、今後起こらないようにするためにも、対策をいろいろと講じてみようかと思います。


文字化けの原因は煎じ詰めていけば、「文字コードの相違」から始まります。
Railsの場合、「UTF-8」がベースになるので、基本的にはすべてがコレになればいいわけですね。

1. environment.rbの設定

まずは【environmen.rb】から。
1行目にこんな文言を追加します。

RUBY:
  1. $KCODE = "UTF8"

Rubyでは、「$KCODE」というグローバル変数で文字コードの設定を行うため。

2. application.rbの設定

次に【application.rb】。
こんな感じで、処理の最初に必ず文字コードのフィルターをかけるようにします。

RUBY:
  1. class ApplicationController <ActionController::Base
  2.   # 日本語化処理
  3.   before_filter :set_charset
  4.  
  5.   private
  6.   def set_charset
  7.     headers["Content-Type"] = "text/html; charset=UTF-8"
  8.   end
  9. end

ここまでで、アプリ側のエンコードはOKのはず。

3.database.ymlの設定

続いて、DBまわりのこと。
【database.yml】で、「encoding」を指定します。

CODE:
  1. development:
  2.   adapter: mysql
  3.   database: dummytunes-development
  4.   username: dummytunes
  5.   password: dummytunes
  6.   host: localhost
  7.   encoding: utf8

4. MySQLサーバー側の設定

さらに、DBのサーバー側の設定。バージョンは4.1(5.0だとうまくいかなかった)。
こちらはコマンドラインから。

個人的に使ったコマンドは以下(順序もそのまま)。

  • show databases;
  • →スキーマのリストを表示。

  • use dummytunes-development;
  • →使うスキーマを選択。use ○○という感じで。

  • show tables;
  • →スキーマの中にあるテーブルのリストを表示。

  • show variables like "char%";
  • →charで始まるスキーマの変数を取得。

たぶん、最後のを使うと、「latin1」という文字コードばかりが並ぶはず。
これが悪いことをする可能性が高いので、2箇所直します。

まず、MySQLAdministratorからView > Startup Variables > AdvancedのDef. Char Setにチェックを入れて、「utf8」に変えます。

次に、先ほどのコマンドラインから、「set names utf8;」と入力し、最終的にこんな感じになればカンペキ。

MySQL:
  1. mysql> SET names utf8;
  2. Query OK, 0 rows affected (0.01 sec)
  3.  
  4. mysql> SHOW variables like "char%";
  5. +--------------------------+---------------------------------------------------------+
  6. | Variable_name            | Value    |
  7. +--------------------------+---------------------------------------------------------+
  8. | character_set_client     | utf8     |
  9. | character_set_connection | utf8     |
  10. | character_set_database   | utf8     |
  11. | character_set_results    | utf8     |
  12. | character_set_server     | utf8     |
  13. | character_set_system     | utf8     |
  14. | character_sets_dir       | C:\Program Files\MySQL\MySQL Server 4.1\share\charsets/ |
  15. +--------------------------+---------------------------------------------------------+
  16. 7 rows in SET (0.02 sec)

もし、それでも一部おかしかったら、スキーマを一回作り直してみるのも手かもしれませんね(乱暴)。

5. DDL関連

たぶん、これで大体大丈夫だとは思いますが、念には念を、ということで、DDLにも手を加えておきます。ポイントは一番下の行。

MySQL:
  1. CREATE TABLE `categories` (
  2.   `id` INTEGER UNSIGNED NOT NULL DEFAULT NULL AUTO_INCREMENT,
  3.   `name` VARCHAR(50) NOT NULL,
  4.   PRIMARY KEY (`id`)
  5. )
  6. ENGINE = INNODB
  7. CHARACTER SET utf8 COLLATE utf8_general_ci;

CHARACTER SETでもutf8を指定しておけば、テーブル単体の文字コードも設定できるので、ついでにやってみます。

長くなってしまいましたが、文字化け対策って、これくらい厳重にやってやっと、というものが多いように思います。
やっておいて損はないことなので、機を見てしっかりやっておくといいですね。

Via:

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加 |

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


  1. No Comments

Leave a Reply