バイナリエンコードはコンピュータがデータを表現する最も基本的な形式です。入力したすべての文字——アルファベット、数字、絵文字——は 0 と 1 の並びとして保存されます。このガイドではテキストからバイナリへの変換の仕組みと UTF-8 エンコード、そしてコードでの実装方法を解説します。
テキストがバイナリに変換されるまで
各文字は文字エンコード標準によって数値にマッピングされ、その数値が 2 進数(バイナリ)で表されます。現代のシステムは UTF-8 を使います。UTF-8 は ASCII との後方互換性を持ち、すべての Unicode 文字をサポートします。
ASCII 文字(1 文字 = 1 バイト)
標準 ASCII 文字(コードポイント 0–127)はそれぞれ 1 バイト(8 ビット)に対応します:
H = 72 = 01001000
e = 101 = 01100101
l = 108 = 01101100
l = 108 = 01101100
o = 111 = 01101111
“Hello” のスペース区切りバイナリ:
01001000 01100101 01101100 01101100 01101111
バイナリ値の読み方
1 バイトを手動でデコードする方法:
01001000
各ビットは右から左に 2 の累乗を表します:
位置:7 6 5 4 3 2 1 0
ビット:0 1 0 0 1 0 0 0
値: 0 +64+ 0 + 0 + 8 + 0 + 0 + 0 = 72 = 'H'
UTF-8 マルチバイト文字
UTF-8 は可変長エンコードです。ASCII 範囲外の文字は 2、3、または 4 バイトを使います:
| コードポイント範囲 | バイト数 |
|---|---|
| U+0000 – U+007F | 1 バイト(ASCII) |
| U+0080 – U+07FF | 2 バイト |
| U+0800 – U+FFFF | 3 バイト(ほとんどの漢字・かな) |
| U+10000 – U+10FFFF | 4 バイト(絵文字、稀な文字) |
例:
© (U+00A9) = 2 バイト:11000010 10101001
日 (U+65E5) = 3 バイト:11100110 10010111 10100101
😀 (U+1F600) = 4 バイト:11110000 10011111 10011000 10000000
1 文字が複数の 8 ビットグループを生成するのは、Unicode テーブル上の位置によって使用バイト数が変わるためです。
オンラインテキスト→バイナリ変換ツール
ブラウザで即時変換するなら:
- テキストを貼り付け → バイナリ出力がリアルタイム更新
- スペース区切り(01001000 01100101…)と連続(0100100001100101…)形式を選択可能
- バイナリを貼り付け → Binary → Text でテキストに戻す
- すべてブラウザ内処理 — データはサーバーに送信されません
コードでの実装
JavaScript(ブラウザ)
ブラウザ組み込みの TextEncoder API を使います:
function textToBinary(text) {
const encoder = new TextEncoder(); // デフォルトは UTF-8
const bytes = encoder.encode(text);
return Array.from(bytes)
.map(byte => byte.toString(2).padStart(8, '0'))
.join(' ');
}
console.log(textToBinary('日本語'));
// 11100110 10010111 10100101 11100110 10011100 10111010 11100101 10101101 10011110
console.log(textToBinary('Hi'));
// 01001000 01101001
バイナリをテキストに戻す:
function binaryToText(binary) {
const bytes = binary
.trim()
.replace(/\s+/g, ' ')
.split(' ')
.map(b => parseInt(b, 2));
const decoder = new TextDecoder('utf-8');
return decoder.decode(new Uint8Array(bytes));
}
console.log(binaryToText('01001000 01100101 01101100 01101100 01101111'));
// Hello
Python
def text_to_binary(text: str) -> str:
return ' '.join(format(b, '08b') for b in text.encode('utf-8'))
def binary_to_text(binary: str) -> str:
parts = binary.strip().split()
return bytes(int(b, 2) for b in parts).decode('utf-8')
print(text_to_binary('日本語'))
# 11100110 10010111 10100101 ...
print(binary_to_text('01001000 01100101 01101100 01101100 01101111'))
# Hello
コマンドライン
python3 -c "
import sys
text = sys.argv[1]
print(' '.join(format(b, '08b') for b in text.encode('utf-8')))
" "日本語"
スペース区切り vs 連続形式
| 形式 | 例 | 用途 |
|---|---|---|
| スペース区切り | 01001000 01100101 | 人間が読みやすい。各バイトが明確 |
| 連続 | 0100100001100101 | コンパクト。一部プロトコルで使用 |
連続形式をデコードするとき、文字列の長さは 8 の倍数である必要があります。そうでない場合、バイナリ文字列が不完全または不正です。
よくある使い方
学習・教育 — バイナリエンコードは CS の基礎概念のひとつ。自分の名前を 2 進数に変換すると、文字とバイトの対応関係が直感的に理解できます。
エンコード問題のデバッグ — 文字化けが発生した際、生のバイナリを確認することで、コーデックの不一致・マルチバイト列の途中切断・BOM の混入を特定できます。
CTF・セキュリティ課題 — テキストとバイナリの変換は CTF の定番問題です。隠しメッセージがバイナリで埋め込まれているケースが多くあります。
プロトコル設計 — バイナリプロトコルやファイルフォーマットを扱う際、文字からバイトへのマッピングを理解しておくことは不可欠です。
バイナリと他のエンコードの比較
| エンコード | ”Hi” の出力 | サイズ | 可読性 |
|---|---|---|---|
| バイナリ | 01001000 01101001 | 最大 | 非常に低い |
| 16 進数 | 48 69 | コンパクト | 中程度 |
| Base64 | SGk= | 元の約 4/3 倍 | 高い |
| ASCII 10 進数 | 72 105 | コンパクト | 中程度 |
テキストセーフなコンパクトエンコードが必要なら Base64 ツール を、10 進数・16 進数・8 進数を並べて確認したいなら ASCII Converter をどうぞ。
まとめ
- テキスト → バイナリ:各文字を UTF-8 でバイト列にエンコードし、各バイトを 8 ビットのバイナリ数値で表す。
- ASCII 文字は 1 バイト;絵文字や多くの漢字は 2〜4 バイト。
- スペース区切り形式はバイトを空白で区切る;連続形式は区切りなし。
- JavaScript は
TextEncoder/TextDecoder、Python は.encode('utf-8')を使う。