Debuginfo

思考とアウトプット

Mojolicious文字化けまとめ

よくハマるのでメモ。

言葉の定義から

  • Encode::decode_utf8 : バイト文字列からPerl内部文字列の変換のこと
  • Encode::encode_utf8 : Perl内部文字列からバイト文字列の変換のこと

Teng等で 

  • deflate : DBに挿入時のファンクション
  • inflate : DBから取ってくるときのファンクション

inflateにdecode_utf8を仕込むとするとすんなり使える。http://shoheik.hatenablog.com/entry/2014/05/14/131718

基本

  • use utf8
  • Mojolicious自身はPerl内部文字列で扱われているので、内部文字列に変換後にMojoliciousのメソッドを使う

参考: UTF-8の扱い/Mojoliciousリファレンス

DBで文字化けしてないか確認

Select文で見たときにすでに文字化けしているときは、それ以前の問題でしょう。 utf8に統一する。確認方法は、

mysql> show variables like 'character_set%';
+--------------------------+------------------------------------------------------+
| Variable_name            | Value                                                |
+--------------------------+------------------------------------------------------+
| character_set_client     | utf8                                                 |
| character_set_connection | utf8                                                 |
| character_set_database   | utf8                                                 |
| character_set_filesystem | binary                                               |
| character_set_results    | utf8                                                 |
| character_set_server     | utf8                                                 |
| character_set_system     | utf8                                                 |
| character_sets_dir       | /usr/local/Cellar/mysql/5.6.17/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------+
8 rows in set (0.10 sec)

内部文字列を考えてるのにおかしい。

mysql_enable_utf8を有効にしてコネクトしてみる。(これで今回は解決(汗)

   +{
            connect_info => 
                [
                    $self->config->{db_dsn},
                    $self->config->{db_user},
                    $self->config->{db_password},
                    +{ mysql_enable_utf8 => 1 }
                ]
        }