バイナリエンコードはコンピュータがデータを表現する最も基本的な形式です。入力したすべての文字——アルファベット、数字、絵文字——は 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+007F1 バイト(ASCII)
U+0080 – U+07FF2 バイト
U+0800 – U+FFFF3 バイト(ほとんどの漢字・かな)
U+10000 – U+10FFFF4 バイト(絵文字、稀な文字)

例:

© (U+00A9) = 2 バイト:11000010 10101001
日 (U+65E5) = 3 バイト:11100110 10010111 10100101
😀 (U+1F600) = 4 バイト:11110000 10011111 10011000 10000000

1 文字が複数の 8 ビットグループを生成するのは、Unicode テーブル上の位置によって使用バイト数が変わるためです。

オンラインテキスト→バイナリ変換ツール

ブラウザで即時変換するなら:

ZeroTool テキスト→バイナリ変換ツールを開く →

  • テキストを貼り付け → バイナリ出力がリアルタイム更新
  • スペース区切り(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コンパクト中程度
Base64SGk=元の約 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') を使う。

テキスト→バイナリ変換ツールを試す →