文字コードとは?文字と数値の対応表で文字化けの原因と対策を理解する

システム開発・テクノロジー
文字コードとは?ざっくりと3行で
  • コンピュータが文字を数値として扱うための「文字と数値の対応規則」のこと。「A」=65・「あ」=12354(UTF-8)というように全ての文字に固有の数値が割り当てられている
  • 異なる文字コード間でデータを変換せずにやり取りすると「文字化け」が発生しUTF-8が現在の世界標準として90%以上のWebサイトで採用されており、日本語システムの開発でも基本はUTF-8一択の時代になっている
  • ASCII・Shift_JIS・EUC-JP・UTF-8・UTF-16など多数の文字コードが存在するが、歴史的な経緯から日本語のITシステムでは複数の文字コードが混在することがあり文字化けトラブルの原因になることがある

【深掘り】これだけ知ってればOK!

主要な文字コードを整理しよう。ASCII(7ビット):英数字・記号・制御文字のみ。128文字。インターネットの基盤。Shift_JIS:マイクロソフト・日本語Windows標準。日本語処理で長年使われてきた。EUC-JP:UNIX/Linuxで使われてきた日本語文字コード。UTF-8:Unicode規格のエンコーディング形式。ASCII互換で全世界の文字を扱える現在の標準。UTF-16:JavaScriptの内部文字コード。BOM(バイトオーダーマーク)に注意。

文字化けが起きる仕組みを理解しよう。文字化けは「送信側の文字コード」と「受信側が解釈する文字コード」が異なるときに発生する。例えば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だと絵文字が保存できない)。

utf8とutf8mb4の違いに注意しよう。MySQLのutf8は最大3バイトで絵文字(4バイトのUnicode文字)を保存できない。utf8mb4は最大4バイトで絵文字を含む全てのUnicode文字を保存できる。現代のWebアプリではutf8mb4を指定することが必須だ。絵文字入りのコンテンツを保存しようとしてエラーになる問題の多くはutf8とutf8mb4の混同が原因だ。

文字コードの歴史を簡単に理解しよう。コンピュータが英語圏で発明されて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の混同が絵文字保存エラーの典型的な原因だ。

会話での使われ方

ITKAGYO運営者デプロイ太郎のアイコン画像

このCSVファイル、Excelで開くと文字化けします。Shift_JISで保存されているのでUTF-8に変換してから使いましょう。

データ担当者がCSVファイルの文字コード変換の必要性を説明している場面。

ITKAGYO運営者デプロイ太郎のアイコン画像

MySQLのテーブルをutf8で作っていたので絵文字が保存できないエラーが出ました。utf8mb4に変更してください。

エンジニアが絵文字保存エラーの原因がutf8とutf8mb4の違いであることを指摘している場面。

ITKAGYO運営者デプロイ太郎のアイコン画像

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アプリ開発の必須設定だ

よくある質問

Q
UTF-8とShift_JISはどちらを使えばいいですか?
A

新規開発はUTF-8一択です。Shift_JISは古いWindowsシステムや日本語特有の文脈で必要な場合がありますが、UTF-8が国際標準でほぼ全ての場面で使用できます。

Q
Pythonでファイルを読み込むときのエンコーディング指定方法を教えてください。
A

open(‘file.txt’, encoding=’utf-8′)でUTF-8を指定します。BOM付きUTF-8の場合はencoding=’utf-8-sig’を使います。Shift_JISはencoding=’shift_jis’またはencoding=’cp932’です。

Q
HTMLのmetaタグのcharset指定はなぜ必要ですか?
A

ブラウザにこのHTMLファイルの文字コードを伝えるために必要です。指定がないとブラウザが自動判定して文字化けするリスクがあります。を全HTMLファイルのheadに記述することが推奨されます。

Q
MySQLの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の公式ドキュメント

:IT用語辞典「文字コード」

コメント

「IT用語、難しすぎて心が折れそう……」という方のための、ハードル低めな用語辞典です。

情報レベルは「基礎中の基礎」。会話を止めないためのエッセンスだけを抽出しています。分かりやすさを追求するあまり、時々例え話が暴走しているかもしれませんが、そこは「ほどよく」聞き流していただけると幸いです。
ほどよくIT用語辞典システム開発・テクノロジー
デプロイ太郎のSNSを見てみる!!
タイトルとURLをコピーしました