導入
文字を保存・通信するとき、内部ではバイト列に変換されます。この変換ルールが文字エンコーディング(現代の標準は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
次章: いよいよ設計の世界、「オブジェクト指向」へ進みます。