読者です 読者をやめる 読者になる 読者になる

Webサービス即日開発の実践4(Perl)〜文字コードの扱い

この開発で文字コードを気にしたのは、以下の2箇所です。
Perlのutf8フラグ
MySQLの4バイト文字対応

【utf8フラグ】
Perlで文字を文字列として扱う場合(表現が微妙ですが)、コード内ではutf8フラグをOnにする必要があり、コードの外部(例えばDBや標準入力/出力など)へ文字列を渡す場合はutf8フラグをOffにする必要があります。
今回のプログラムでの文字情報は
1.TwitterAPI→Perl
2.PerlMySQL
3.MySQLPerl
4.PerI→html
の四ヶ所で移動します。

1はNet::Twitterでツイート情報を取得した場合、値はutf8フラグがOnされている状態でしたので、追加でエンコードはしていません。
2はMySQLに書き込む際、DBIx::Class::Schema::Loaderを使用しており、そこでUTF8Columnsを用いてutf8フラグをOffにしました。
3,4はMySQLからutf8フラグOffで取得した文字列をそのままhtml に出力しています。(のつもりです。)

MySQLの4バイト文字対応】
ツイートやユーザ名に😄といった記号など、4バイト文字が含まれるケースがあります。こうした文字をMySQLで扱う場合、データベースの文字コードをutf8mb4にする必要があります。実装はこちらhttp://d.hatena.ne.jp/kaze-kaoru/touch/20110829/1314598374を参考にして
・データベースの文字コードをutf8mb4で作成

Perlでデータベースに書き込む際、mysql_enable_utf8を指定しない

・my.cnfのclientでdefault-character-set=utf8mb4と設定(リンク先の通りにperlグループを作る方がよいですが、デフォルトではclientグループの値が参照されるので、clientに設定しても動きます。)

DBIx::Class〜で接続する際に、mysql_read_default_file=でmy.cnfを指定

することで、無事に絵文字などもMySQLに格納出来ました。MySQLのバージョンが5.5以上でないといけないことも、要注意です。