プログラミング

Djangoアプリで日本語が文字化けするときにまず確かめるべきこと

Djangoで開発を行う際、フロントエンド側で日本語が文字化けしてしまうことがあります。私はDjango REST Frameworkを使用した際、本来日本語で表示されるべきフロントエンド側の表示が ????? になってしまったことがありました。今回はこのようにDjangoにおいて日本語が文字化けしてしまう際にまず試しておくべきことをご紹介します。

データベース設定

私が直面した日本語が ????? になってしまうという問題は、Djangoが指定する文字コードとデータベースに設定されている文字コードに差異があるときに起こります。ここではmysqlをデータベースとして使用した際の対処法について書きます。

文字コード

おそらく日本語を扱いたい場合に最も使用される頻度が高い文字コードはUnocodeでしょう。MySQLの場合、歴史的な理由で utf-8 と utf8mb4 という2種類が使われています。https://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a
MySQLで文字コードを設定する場合、上のリンクで紹介されているような操作をすると思います。このときに文字コードを utf-8 として設定してしまっている場合、日本語表示に問題が起きてしまいます。MySQLの utf-8 は4バイト文字列が扱えません。よって特殊な文字を使う際にはそもそもutf-8 ではなく utf8mb4 で設定しないといけないのです。(無難に utf8mb4 を設定するのがいいと思います。)

utf8mb4 に設定した場合

MySQLの文字コード設定を utf8mb4 にした場合、そもそも4バイトの文字列が使えないという心配はありません。しかし、今回扱っている日本語が????になってしまうという問題はutf8mb4 に設定されている場合にも起こります。よってこのエラーをなくすためにDjangoのアプリ側で文字コードをutf8mb4 に合わせてあげる必要があります。

Django設定

MySQLの文字コード設定がutf8mb4 でデータベース接続の設定がutf-8の場合、4バイト文字列は ????? で表示されます。データベース接続の設定とは、Djangoアプリのsettings.pyで指定している文字コードのことです。

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': env('DB_NAME'),
'USER': 'root',
'PASSWORD': env('DB_PASSWORD'),
'HOST': 'localhost',
'PORT': 3306,
'OPTIONS': {'charset': 'utf8mb4'},
}
}

 

通常DjangoでMySQLを使う際には、このようにデータベース項目を設定します。このとき

'OPTIONS': {'charset': 'utf8mb4'},

 

'OPTIONS': {'charset': 'utf-8'},

 

になっていた場合、最初の例に挙げたような日本語が?????に文字化けするという現象が発生してしまいます。
よってDjangoアプリで日本語が?????に文字化けするときは、settings.pyのOPTION項目を確認してみてください。ここをデータベースの設定に合わせてあげると、多分動くようになると思います。

まとめ

Djangoアプリで日本語が?????に文字化けするときは、MySQLの文字コード設定がutf8mb4であるかどうか確認する。utf-8になっていたらutf8mb4に変更し既存のカラムにも設定を反映させる。次にDjangoのsettings.pyを確認し、接続オプションをutf8mb4に指定する。

ABOUT ME
gitackt
お金をかけないサバイバル術の記事を書きます。温泉と餃子が好きです。プログラミングが得意です。趣味はメルカリです。