本文へスキップ
BecomeCoder

C#文法コース · 第8章 標準ライブラリの必需品 · レッスン59

文字エンコーディングとBase64

ブラウザで完結

導入

文字を保存・通信するとき、内部ではバイト列に変換されます。この変換ルールが文字エンコーディング(現代の標準はUTF-8)です。さらに、バイト列を安全に文字列として運ぶBase64は、画像の埋め込み認証トークンで頻出します。「文字化け」の正体を理解しておきましょう。

図解

flowchart LR
    S["文字列 "Hello""] -->|Encoding.UTF8.GetBytes| B["バイト列 72 101 ..."]
    B -->|Convert.ToBase64String| B64["Base64文字列 SGVsbG8="]
    B64 -->|FromBase64String| B
    B -->|Encoding.UTF8.GetString| S

サンプル

// 文字列 ⇔ バイト列(UTF-8)
byte[] bytes = Encoding.UTF8.GetBytes("Hi");
Console.WriteLine(bytes.Length);                     // 2(半角英数は1文字1バイト)
Console.WriteLine(Encoding.UTF8.GetBytes("あ").Length); // 3(日本語は1文字3バイト)

// Base64: バイト列を文字だけで表す(メール・JSON・URLで安全に運べる)
string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes("Hello"));
Console.WriteLine(base64);                            // SGVsbG8=

// 元に戻す(デコード)
byte[] back = Convert.FromBase64String(base64);
Console.WriteLine(Encoding.UTF8.GetString(back));     // Hello
  • 文字列とバイト列の変換はEncoding.UTF8.GetBytes / GetString
  • UTF-8では半角英数は1バイト、日本語はおおむね3バイト(これが文字数とバイト数の食い違いの原因)
  • Convert.ToBase64String / FromBase64Stringでバイト列を文字列として安全に運べる

演習

// TODO: "AB" をUTF-8のバイト列にし、Base64文字列へ変換して出力してください(QUI=)
___
  • 期待される出力: QUI=
ヒント1を見る

Encoding.UTF8.GetBytes("AB")Convert.ToBase64String(...)に渡します

ヒント2を見る

Console.WriteLine(Convert.ToBase64String(Encoding.UTF8.GetBytes("AB")));

まとめ

  • 文字列⇔バイト列の変換ルールが文字エンコーディング(標準はUTF-8)
  • 文字数とバイト数は一致しない(日本語は1文字3バイトが目安)
  • バイト列を文字で運ぶBase64はConvert.ToBase64String/FromBase64String

次章: いよいよ設計の世界、「オブジェクト指向」へ進みます。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。