今回は、Javaで作成したアプリのディプロイした後に発生する文字化けについて書いて行きたいと思います。
そして今回書く所は、ディプロイする際にかなり手こずったエラーでもあります。
エラー内容
私が今回遭遇したのは、こんな感じのエラーです。
Twitterのようなささやきというものも前に作成しました。
そのサイトをディプロイした際に起きたエラーです。
日本語入力をすると文字のエラーがエラーが発生します。
英数字ではエラーは起きません。
プログラムからでなく直接データをデータベースに入力すると、その下の文ように入力自体は問題なく出来ます。
原因を探る その1
色々原因を探りました。
まず目を付けたのがデータベースの設定です。
データベースの設定には、2つのコマンドがあります。
グローバル変数とセッション変数という設定です。
グローバル変数を見る為のコマンドは、
mysql> show global variables like 'character%';
セッション変数を見る為のコマンドは、
mysql> show variables like "character%";
となっています。
最初はすべてlatin1になっていましたが、etc/my.cnfのオプションファイルをutf-8しました。
こちらのやり方はネットで沢山出てくるので「MySQL 文字化け」など探してみて下さい。
必要な過程ではありますが、長くなるので今回は省略させて頂きます。
セッション変数の確認コマンドで確認するとutf8が設定できました。
しかしこれではエラー改善ならず
テーブルに文字コードの設定を加えて再度つくりなおしてみましたがこれでも改善ならず。
+--------------------------+------------------------------+
| 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 | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql56/charsets/ |
+--------------------------+------------------------------+
原因をさぐる その2
次に考えてたのがファイルのコード設定です。
確認します。
問題が起きているファイルの設定には問題なく記述してあります。
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
パラメータの受け取りも設定してある。
request.setCharacterEncoding("UTF-8");
もう分かんなくなったので、
フィルタークラスを作成しすべてにフィルターを通したりもしました。
行けるかなと思いましたが、こちらもエラー改善ならず。
原因を探る その3
ブラウザの文字コード設定の確認。
Safariメニューの表示のエンコーディングテキスト見れるので確認しましたがutf-8なので問題なさそう。
原因を探る その4
色々調べていると「????」というのは文字化けというかはJava特有のエラーと言うような事がちらほらネット上に見つかりました。
Javaのプログラムだと相性の問題で日本語が認識できず?????とデータベースに入力されてしまうようなので、呼び出す際にutf-8で呼び出す設定を行う必要があるようです。
私の場合daoパッケージのJDBC用のURLを生成するコードのURL部分に?から先の下記コードを埋め込むことでエラー解決しました。
String dbUrl = "jdbc:mysql://"〜〜〜〜〜〜〜〜〜"?useUnicode=true&characterEncoding=utf8";
結果
問題なく日本語入力が可能となりました。
まとめ
エラーが解決できないと途方に暮れると思います。
何回も同じページを見たりディプロイし直したりと骨が折れます。
今回もエラーを改善するので悪戦苦闘したので解決出来た時は本当に嬉しかったです。
おそらくこのエラーにぶち当たるのはディプロイ前の最後壁になるのではないかなと思います。
このブログが誰かのお役に立てれば光栄です。
今回も最後までお読みいただきましてありがとうございました。
駆け出しエンジニア けいこ♂
コメント