- コンピュータが文字を数値として扱うための「文字と数値の対応規則」のこと。「A」=65・「あ」=12354(UTF-8)というように全ての文字に固有の数値が割り当てられている
- 異なる文字コード間でデータを変換せずにやり取りすると「文字化け」が発生しUTF-8が現在の世界標準として90%以上のWebサイトで採用されており、日本語システムの開発でも基本はUTF-8一択の時代になっている
- ASCII・Shift_JIS・EUC-JP・UTF-8・UTF-16など多数の文字コードが存在するが、歴史的な経緯から日本語のITシステムでは複数の文字コードが混在することがあり文字化けトラブルの原因になることがある
【深掘り】これだけ知ってればOK!
文字化けが起きる仕組みを理解しよう。文字化けは「送信側の文字コード」と「受信側が解釈する文字コード」が異なるときに発生する。例えばShift_JISで書かれたテキストをUTF-8として読み込むと、文字に対応する数値の解釈が違うため全く異なる文字が表示される。HTMLでは``を指定することでブラウザに文字コードを伝えている。
プログラミングでの文字コードの注意点を理解しよう。Pythonの文字コード:Python 3はデフォルトでUTF-8。ファイル読み込み時は`open(‘file.txt’, encoding=’utf-8′)`で文字コードを指定する。BOM付きUTF-8(UTF-8-sig)のファイルを読む場合は`encoding=’utf-8-sig’`が必要。MySQLの文字コード:テーブル作成時にDEFAULT CHARACTER SET utf8mb4を指定する(utf8だと絵文字が保存できない)。
文字コードの歴史を簡単に理解しよう。コンピュータが英語圏で発明されてASCIIが標準になった。日本語処理のためにShift_JIS・EUC-JPが開発された。インターネットの普及で世界中の文字を扱えるUnicodeが必要になりUTF-8が実装方式として標準化された。現在はUTF-8が全Webサイトの90%以上で採用されている。
よくある誤解
文字コードは日本語専門の問題だと思っている
文字コードは全ての言語に関係する。英語のみを扱う場合でもファイルのエンコーディング・データベースの文字コード・HTTPレスポンスのcharset指定など文字コードの設定は必要だ。また世界共通の文字コードとしてUTF-8が標準化されることで国際化対応が容易になった。
MySQLのutf8とutf8mb4は同じだと思っている
MySQLのutf8は最大3バイトで絵文字(4バイトの文字)を保存できない。utf8mb4は最大4バイトで絵文字を保存できる。現代のWebアプリではutf8mb4を使うことが必須で、utf8とutf8mb4の混同が絵文字保存エラーの典型的な原因だ。
会話での使われ方

このCSVファイル、Excelで開くと文字化けします。Shift_JISで保存されているのでUTF-8に変換してから使いましょう。
データ担当者がCSVファイルの文字コード変換の必要性を説明している場面。




MySQLのテーブルをutf8で作っていたので絵文字が保存できないエラーが出ました。utf8mb4に変更してください。
エンジニアが絵文字保存エラーの原因がutf8とutf8mb4の違いであることを指摘している場面。




Pythonでファイルを読み込むとき`encoding=’utf-8-sig’`を指定しないとBOM付きUTF-8のファイルで先頭に変な文字が入ります。
エンジニアがPythonでのBOM付きUTF-8ファイルの読み込み方法を説明している場面。
【まとめ】3つのポイント
- 文字と数値の対応規則で異なる文字コード間の不一致が文字化けの原因:送信側の文字コードと受信側が解釈する文字コードが一致していないときに文字化けが発生するためHTMLのcharset指定・DBのcharacter set設定・ファイルのencoding指定を統一することが重要だ
- UTF-8が現在の世界標準で新規開発は全てUTF-8一択:全Webサイトの90%以上で採用されているUTF-8は国際化対応・ASCII互換・全世界の文字を扱えるという特性から新規システムでの文字コードはUTF-8を選択することが現代の標準だ
- MySQLはutf8ではなくutf8mb4を使って絵文字対応を確実にする:MySQLのutf8は絵文字(4バイトのUnicode文字)を保存できないためテーブル作成時にDEFAULT CHARACTER SET utf8mb4を指定することが現代のWebアプリ開発の必須設定だ
よくある質問
-
QUTF-8とShift_JISはどちらを使えばいいですか?
-
A
新規開発はUTF-8一択です。Shift_JISは古いWindowsシステムや日本語特有の文脈で必要な場合がありますが、UTF-8が国際標準でほぼ全ての場面で使用できます。
-
QPythonでファイルを読み込むときのエンコーディング指定方法を教えてください。
-
A
open(‘file.txt’, encoding=’utf-8′)でUTF-8を指定します。BOM付きUTF-8の場合はencoding=’utf-8-sig’を使います。Shift_JISはencoding=’shift_jis’またはencoding=’cp932’です。
-
QHTMLのmetaタグのcharset指定はなぜ必要ですか?
-
A
ブラウザにこのHTMLファイルの文字コードを伝えるために必要です。指定がないとブラウザが自動判定して文字化けするリスクがあります。を全HTMLファイルのheadに記述することが推奨されます。
-
QMySQLのutf8mb4に変更するにはどうすればいいですか?
-
A
テーブルのALTER TABLE文でCONVERT TO CHARACTER SET utf8mb4を使って変換できます。また接続時の文字コード設定(SET NAMES utf8mb4)も確認してください。
【出典】参考URL
https://developer.mozilla.org/ja/docs/Glossary/character_encoding :MDNの文字コードの解説
https://dev.mysql.com/doc/refman/8.0/ja/charset-unicode-utf8mb4.html :MySQLのutf8mb4の公式ドキュメント




コメント