はじめに
"エンコード" や "デコード"、"文字エンコーディング" といったワードを頻繁に見るようになってきたため、ここで目的や内容をまとめていきます。
これらを理解するための前提として、コンピュータのデータ処理の特性について知る必要があります。
バイナリ
コンピュータは「0」と「1」のバイナリデータしか理解することができません。
バイナリとは、「0」と「1」の2進数で表現されるデータのことです。
コンピュータは、電気信号の「オン(1)」と「オフ(0)」で情報を処理するため、すべてのデータを「0」と「1」の組み合わせ(バイナリデータ)として扱います。
人間と異なる言語を扱っているため、バイナリデータをエンコード・デコードによって他の形式にデータを変換することで、人間とコンピュータお互いが理解できる形でコミュニケーションをとることができるようになります。
※バイナリデータは、バイト列で表現され、人間が直接読むことはできません。
●バイナリデータの特徴
① 最小単位はビット(bit)
1ビットは「0」または「1」の値を取ります。
② 8ビット = 1バイト(byte)
1バイトは8ビットで構成され、256通り(2^8)の値を表現できます。
●メリット
① データの効率性
バイナリデータは、テキストデータに比べて効率的に保存・伝送できます。
(例)画像や音声をテキスト形式で保存すると、データサイズが非常に大きくなりますが、バイナリ形式で保存するとコンパクトになります。
② セキュリティ
バイナリデータは、そのままでは人間が読みにくいため、機密データの保護に役立ちます。
(例)暗号化されたデータは、バイナリ形式で保存されます。
③ データの正確性
人間が意図した通りにデータをコンピュータに伝えるために必要です。
(例)文字化けを防ぐために、正しい文字エンコーディングを使用する。
●具体例
・テキストデータ:文字列は、バイナリデータとしてエンコード(機械語に翻訳)されます。
・画像データ:画像は、ピクセルの色情報をバイナリデータとして表現します。
・音声データ:音声は、波形データをバイナリ形式で表現します。
・実行ファイル:プログラムの実行ファイルは、バイナリデータで構成されています。
エンコード(Encoding)
人間が理解できるデータを、コンピュータが処理できる形式に変換することです。
ここでは、よく利用されるエンコード方式について紹介します。
① URLエンコード(パーセントエンコード)
URLで使用できない文字(スペース、特殊記号など)を、%
と16進数で表現します。
主にウェブブラウザやサーバー間でデータを安全に伝送するために使用されます。
【具体例】
元のURL: https://example.com/search?q=Hello World
エンコード後: https://example.com/search?q=Hello%20World
② Base64エンコード
バイナリデータをテキスト形式(A-Z, a-z, 0-9, +, /)に変換します。
メールの添付ファイルや画像データの埋め込みなど、バイナリデータをテキストベースのプロトコルで伝送する際に使用されます。
【具体例】
元のデータ: Hello
エンコード後: SGVsbG8=
③ HTMLエンコード(エンティティエンコード)
HTMLで特殊な意味を持つ文字(例: <, >, &)を、エンティティ参照(<, &など)に変換します。
XSS(クロスサイトスクリプティング)攻撃を防ぐために使用されます。
【具体例】
元のテキスト: <script>alert('XSS');</script>
エンコード後: <script>alert('XSS');</script>
④ JSONエンコード
データをJSON(JavaScript Object Notation)形式に変換します。
ウェブAPIや設定ファイルで広く使用されています。
特殊文字はエスケープされます(" は " にエンコードされます)。
【具体例】
元のデータ: {"message": "Hello, World!"}
エンコード後: {"message": "Hello, World!"}
⑤ ASCIIエンコード
英数字、記号、制御文字を7ビットの数値で表現します。
基本的なテキストデータのエンコーディングとして広く使用されています。
【具体例】
・文字 A
は 65(10進数)または 41(16進数)にエンコードされます。
・文字 a
は 97(10進数)または 61(16進数)にエンコードされます。
デコード(Decoding)
コンピュータが処理できる形式を、人間が理解できるデータに変換することです。
デコード方式はエンコード方式と対になるように存在します。
文字エンコーディング(Character Encoding)
文字エンコーディングは、文字をコンピュータが理解できる数値(バイト列)に変換するためのルールです。
異なる文字エンコーディングを使用すると、同じ文字でも異なる数値で表現されることがあります。
① ASCIIエンコーディング
ASCIIは、英数字や記号を7ビットの数値で表現するエンコーディングです。
【具体例】
・文字 A
は 65 で表現されます。
・文字 a
は 97 で表現されます。
② UTF-8エンコーディング
UTF-8は、Unicodeを基にした可変長のエンコーディングで、世界中の文字を表現できます。
【具体例】
・文字 A
は 65 で表現されます(ASCIIと同じ)。
・文字 あ
は 227 129 130(16進数で E3 81 82)で表現されます。
③ Shift_JISエンコーディング
Shift_JISは、日本語を表現するためのエンコーディングです。
【具体例】
文字 あ
は 130 160(16進数で 82 A0)で表現されます。
注意点
文字化けが発生する可能性、セキュリティ面で注意する必要があります。
文字化け
文字エンコーディングが正しく設定されていないと、文字化けが発生します。
例えば、UTF-8でエンコードされたデータをShift_JISでデコードすると、正しく表示されません。
セキュリティ
エンコード・デコードを誤ると、セキュリティ上の問題が発生する可能性があります。
例えば、XSS攻撃を防ぐために、ユーザー入力のエスケープ処理が必要です。
参考URL
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89 (Wikipedia『エンコード』)
https://www.tohoho-web.com/perl/encode.htm (とほほのWWW入門『エンコード・デコード』)
https://zenn.dev/ykmra/articles/0640e31ab62b52 (『encodeとdecode』)
※一部、DeepSeek検索の内容を活用