UTF-8 を Base64URL に変換するには、4 つの手順を実行します:(1)テキストを UTF-8 バイトにエンコード、(2)標準 Base64 を適用、(3)+ を - に、/ を _ に置換、(4)末尾の = パディングを削除。これにより、RFC 4648 に準拠したURL セーフな文字列が生成され、JWT や API ヘッダーで広く使用されています。
標準 Base64 と Base64URL の違い
| 文字 | 標準 Base64 | Base64URL | 理由 |
|---|---|---|---|
| 62 番目の文字 | + |
- |
+ は URL でスペースを意味する |
| 63 番目の文字 | / |
_ |
/ は URL のパス区切り文字 |
| パディング | = 必須 |
省略 | = は URL で %3D になる |
| URL セーフ | いいえ | はい | クエリ文字列やファイル名に直接使用可能 |
RFC 4648 §5 により、この「URL およびファイル名セーフアルファベット」はシステム間の互換性を保証します。

4 ステップの変換プロセス
| ステップ | 操作 | 例(“Hello”) |
|---|---|---|
| 1 | UTF-8 テキスト → バイト | H e l l o → バイト配列 |
| 2 | バイト → 標準 Base64 | SGVsbG8= |
| 3 | + を - に、/ を _ に置換 |
ここでは変更不要 |
| 4 | 末尾の = パディングを削除 |
SGVsbG8 |
Wikipedia によると、Base64 エンコードによりデータサイズは約 33% 増加します。

Unicode と絵文字の処理
NextUtils によると、Base64 はエンコードであり、暗号化ではありません——テキストのみのチャネルを通じてデータを転送するものです。文字化け(「Mojibake」)を防ぐには、必ず TextEncoder を使用して UTF-8 バイトに変換してください。
| 入力 | TextEncoder なし | TextEncoder あり |
|---|---|---|
Hello 世界! 🌍 |
文字化け / TypeError | 正しい Base64URL |
コード例
JavaScript(ブラウザ)— Unicode セーフ
function toBase64Url(str) {
const bytes = new TextEncoder().encode(str);
const base64 = btoa(String.fromCharCode(...bytes));
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
Python 3 — 標準ライブラリ
AskPython に基づく説明:
import base64
data = "Hello 世界! 🌍"
encoded = base64.urlsafe_b64encode(data.encode('utf-8')).decode('utf-8').rstrip('=')
print(encoded)
Node.js — Buffer 変換
const str = "API_Payload_Data";
const base64url = Buffer.from(str, 'utf8')
.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
トラブルシューティング:パディングエラー
| エラー | 原因 | 解決方法 |
|---|---|---|
binascii.Error: Incorrect padding |
= パディングが不足 |
長さが 4 の倍数になるまで = を追加 |
atob() で TypeError |
非 ASCII 文字が含まれている | 先に TextEncoder を使用 |
| 出力が文字化け | UTF-8 エンコードをスキップした | Base64 の前に必ずバイトにエンコード |
AskPython によると、不足パディングの計算方法:padding_needed = (4 - len(data) % 4) % 4、その後、該当する数の = 文字を追加します。
ユースケース:JWT と Data URI
JWT(JSON Web Token)の構造
| 部分 | 内容 | エンコード方式 |
|---|---|---|
| ヘッダー | アルゴリズム + トークンタイプ | Base64URL |
| ペイロード | クレーム(ユーザーデータ、有効期限) | Base64URL |
| 署名 | HMAC または RSA 署名 | Base64URL |
JWT は通常 eyJ で始まります——これは {(JSON の左波括弧)の Base64URL エンコードです。

ユースケース別の Base64 と Base64URL の使い分け
| ユースケース | エンコード方式 | パディング |
|---|---|---|
| JWT トークン | Base64URL | 省略 |
| Data URI(埋め込み画像) | 標準 Base64 | 必須 |
| HTTP Basic 認証 | 標準 Base64 | 必須 |
| URL クエリパラメータ | Base64URL | 省略 |
まとめ
4 つのステップ:UTF-8 バイト → Base64 → +/ を -_ に置換 → パディングを削除。JavaScript では TextEncoder、Python では base64.urlsafe_b64encode()、Node.js では Buffer を使用してください。RFC 4648 に準拠してシステム間の互換性を確保します。Base64URL はエンコードであり、暗号化ではありません——セキュリティには AES-256 または TLS を使用してください。
よくある質問
Base64URL は暗号化と同じですか?
いいえ。Base64URL は可逆的なエンコードです——鍵がなくても誰でもデコードできます。機密データの保護には AES-256 または TLS/SSL を使用してください。
なぜ Base64URL は標準の Base64 デコーダで失敗するのですか?
標準デコーダは +、/、および = パディングを期待します。Base64URL は -、_ を使用し、パディングを省略します。デコード前に文字の置換を元に戻し、パディングを復元する必要があります。
なぜ JWT ではパディングが省略されるのですか?
= 文字は URL で %3D になり、文字列が長くて読みにくくなります。RFC 4648 では、デコーダがパディングマーカーなしで元の長さを再構築できるため、省略が許可されています。

コメントを残す