コード → 文字

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

コード → 文字

このレッスンで分かること

  • 4 言語にはそれぞれの呼び方があります
  • Pythonchr はとてもシンプルです
  • JavaScriptString.fromCharCode を使います

コード → 文字 とは

整数 (ASCII コード) を受け取り、対応する 1 文字を返す関数を実装します。文字コードから文字への逆変換を 4 言語で書きます。

前のレッスンでは 文字 → コード の変換を扱いました。今回は逆方向、コード → 文字 を実装します。これも文字コードを「整数のテーブル」として捉えられれば自然に理解できます。ASCII テーブルにおいて 65 → 'A'97 → 'a'48 → '0' のような対応関係が決まっており、関数はこのテーブルを引くだけです。実用面では、シーザー暗号の復号、base64 のような符号化、テキスト生成プログラムの土台など、登場する場面はとても多いです。

4 言語にはそれぞれの呼び方があります。Python では chr(n)JavaScript では String.fromCharCode(n)Java では (char) n のキャスト、Go では string(rune(n)) を使うのが定番です。挙動はどれも「整数 1 つ → 文字列 1 文字 (もしくは char)」です。ord が ordinal なら chr は character。名前を結びつけて覚えておくと忘れにくくなります。

文字コードは双方向の変換。chr(ord(c)) == cord(chr(n)) == n という関係が成り立ちます。

各言語での書き方

Pythonchr はとてもシンプルです。

Python

print(chr(65)) # 'A' print(chr(97)) # 'a' print(chr(48)) # '0' print(chr(32)) # ' ' (スペース)

JavaScriptString.fromCharCode を使います。引数は数値であり、戻り値は長さ 1 の文字列です。複数渡せば連結された文字列が返ります。

JavaScript

console.log(String.fromCharCode(65, 66, 67)); // 'ABC' console.log(String.fromCharCode(72, 105)); // 'Hi'

Java では char 型を String に変換する手間が必要です。Character.toStringString.valueOf を使うか、文字列連結 "" + (char) n で短く書く流派もあります。今回のレッスンでは型を String に揃えるため String.valueOf を使う書き方で実装します。

Java

char c = (char) 65; // 'A' String s = String.valueOf(c); // "A"

Go では rune を介して文字列に変換するのが定石です。

Go

fmt.Println(string(rune(65))) // "A"

変換の用途を可視化

diagram (will load when visible)

図のポイント (テキスト併記)

  • 変換の流れは単純ですが、組み合わせれば便利な関数が作れます

変換の流れは単純ですが、組み合わせれば便利な関数が作れます。たとえば「英大文字 → 英小文字」は chr(ord(c) + 32) で実装できますし、「アルファベット n 番目の文字」は chr(ord('A') + n) で取り出せます。アルファベット生成、A から Z までのループも 1 行で書けます。

Pythonchr は引数を 0..0x10FFFF の範囲に拡張しており、絵文字や日本語の文字も生成できます。たとえば chr(0x3042) です。

よくある間違い

1 つめは、chr に範囲外の値を渡すケースです。Pythonchr(-1)chr(0x110000)ValueError になりますし、JavaScriptString.fromCharCoden を 16 ビットで切り詰めるため、String.fromCharCode(0x10042) は意図しない文字を返します。2 つめは、JavacharString に変換し忘れて返却型が合わないエラーです。3 つめは、Gostring(65) と書いてしまうケースで、これは Go 1.15 以降で警告が出ます。string(rune(65)) と書くのが正解です。

Python

# NG chr(-1) # ValueError # OK chr(0) # '\x00' (NUL 文字)

よくある実装パターン

文字コードから文字を生成する機能は、単純そうに見えて応用範囲がとても広いです。アルファベットを A から Z まで生成するループ、Excel の列番号 (A B ... Z AA AB ...) の変換、base64 のような符号化、シーザー暗号の復号、CSV の特殊文字 (タブ \t やカンマ ,) の挿入など、整数 → 文字 を必要とする場面は枚挙にいとまがありません。

Python

# A から Z までを生成 alphabet = [chr(ord('A') + i) for i in range(26)] print(alphabet) # ['A', 'B', ..., 'Z']

JavaScript

// 0..25 をアルファベットに変換 const alphabet = Array.from({length: 26}, (_, i) => String.fromCharCode(65 + i)); console.log(alphabet);

この「コード生成」のパターンを覚えると、回文判定アナグラム判定 といった文字列アルゴリズムのコードがぐっとシンプルになります。

整数 → 文字 は単なる API ではなく、文字列処理のあらゆる場面で活躍する基本ピース。

やってみよう

整数 n を受け取り、対応する 1 文字を文字列として返す関数 codeToChar(n) を 4 言語で実装します。ASCII 範囲 (0..127) のみテストするので、特殊なエッジケースを気にする必要はありません。Python なら chr(n)JavaScript なら String.fromCharCode(n)Java なら String.valueOf((char) n)Go なら string(rune(n)) を使ってください。65 → "A"97 → "a"48 → "0" がそれぞれ通れば成功です。実装したら chr(ord('A')) == 'A' のような「行って戻ってくる」検算をしてみると、文字コードの双方向性を実感できます。

よくある質問

Q. このトピックを覚える意味は何ですか?

A. アプリ層の上っ面だけ追わず、内部で何が起きているかを理解するための土台になります。例えばエンコーディングや進数変換は、文字化け・整数オーバーフロー・データサイズ計算で必ず出会う知識です。実務での問題解決スピードが格段に上がります。

Q. 実務でこの知識を使う場面は?

A. API の Content-Length 計算、ファイルアップロードのサイズ制限、画像処理での色深度計算など、低レベルな数値を扱う場面で頻出します。OS・ネットワーク・暗号の理解にも繋がるため、CS の共通言語と思って習得しておくと一生使える知識です。

Q. 他の章とどう繋がりますか?

A. 後続の章で扱うデータ構造(スタック・キュー)、アルゴリズム(探索・ソート)の基礎になります。「データを 32 bit でどう表現するか」「メモリにどう載せるか」が分かると、後続トピックの実装が腹落ちしやすくなります。

次のレッスン

次は UTF-8 のバイト長を返す に進みましょう。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. コード→文字 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. コード→文字 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 整数を受け取り 1 文字の文字列を返す
  2. ASCII 範囲 (0..127) を扱う
  3. 戻り値の長さは 1

入出力例

test-cases.txt

codeToChar(65)"A" codeToChar(90)"Z" codeToChar(97)"a" codeToChar(122)"z" codeToChar(48)"0" codeToChar(57)"9" codeToChar(32)" "

ヒント

main.py
main.py
学習モード

メモ

コード → 文字

⌘S で保存