
武蔵野個別指導塾の特徴
高校情報I 文字と文字コード—文字の種類と符号の対応を表から読み解く|武蔵野個別指導塾

展示ラベルの文字を自作表で符号位置へ対応させ、保存列から戻す操作を通じて、表と符号化方式の役割を区別できます。
よくあるのは、展示のラベルを記録する高校生が、文字に付いた番号と保存されるバイト列を同じ物だと考える場面です。表には同じ数字が並んでいても、番号をどう列にするかは別の取り決めです。文字から記録へ進むときも、記録から文字へ戻るときも、どの表と規則を使ったかをたどります。
問題で求められる道筋
出方の1つは、対応表と符号化の規則を受け取り、文字列を保存用の列に直す問題です。文字の順に位置を調べ、各位置を規則に従って表し、順番を保ってつなぎます。見慣れた文字でも、記憶している別の表を持ち込まず、問題の表を使います。
もう1つは、列を文字列に戻し、記録の途中が欠けた場合や表にない値が現れた場合を判断する問題です。固定長なら指定の幅で区切れますが、区切れたことと、各部分に対応する文字が存在することは別です。表を照合してから答えます。
さらに、表または符号化方式を変えたとき、どこが変わり、何を共有すれば復元できるかを説明する問題もあります。位置の番号が同じでも保存列が同じとは限りません。逆に列が同じでも、その読み方の規則が違えば、同じ位置に戻るとは限りません。
文字から保存までの3段階
文字は、文章を構成する単位です。ここでは展示物を表す「花」「鳥」などを文字として扱います。見た目を描く字形と、文字を区別することも同じではありません。形を変えて表示しても、同じ文字として扱う場合があります。
符号位置は、ある文字の集合の中で文字に対応させた番号です。番号は文字そのものでも、保存された0と1の列そのものでもありません。表に「花」と位置1の対応があれば、その表の中で花を位置1として扱います。別の表で同じ番号が別の文字を指すこともあり得ます。
符号化方式は、その位置を記録や交換に使う列へ写す規則です。例えば位置1を3桁の2進数で001にする規則と、位置に1を足して3桁にする規則では、同じ位置から異なる列を作れます。後者は説明のための自作規則で、実在する文字コードの割当てを示すものではありません。図1のように、表と方式を別の矢印として捉えると、どの段階の取り決めかを説明できます。

図1の右向きは符号化、左向きにたどる操作は復号です。復号には、列を位置へ戻す規則と、位置を文字へ戻す表が必要です。規則に対応しない列や表に登録されていない位置なら、推測して文字を補わず、復号できないこととその位置を示します。
ビットは0または1の一桁です。バイトは通常8ビットをまとめた単位ですが、以下の基本例は説明しやすい3ビットの列を使い、バイトとして保存する方法は指定しません。3ビットの列をそのまま1バイトと呼んだり、余った部分に勝手に0を足したりしないことが大切です。実際にバイト列を扱う問題では、詰め方や区切りを含めた条件が必要です。
基本例題:展示ラベルを往復する
展示用に次の自作表を作ります。文字「花」「鳥」「石」「木」の位置を順に1、2、3、4とします。方式Aは位置を3桁の2進数にし、先頭の0も残します。文字列「鳥花木」を符号化し、区切りを示したビット列で答えた後、逆に復号してください。
| 文字 | 符号位置 | 方式Aの列 |
|---|---|---|
| 花 | 1 | 001 |
| 鳥 | 2 | 010 |
| 石 | 3 | 011 |
| 木 | 4 | 100 |
まず文字を順に表で探すと、位置は2、1、4です。各位置を3桁で表すと010、001、100です。答えは区切りを見せて「010 001 100」です。空白は読みやすくするための区切りであり、保存するビットには数えません。図2のように、文字の並びと位置の並びの順序を保ちます。

図2を逆にたどって確かめます。010は位置2、001は位置1、100は位置4です。表を逆に引くと「鳥花木」となり、元の並びに戻ります。位置4を100と書く際、4という十進の数字をそのまま保存するのではなく、指定された2進の3桁に変えた点も確かめます。
この表に位置0、5、6、7の文字は登録されていません。方式Aで作れる3桁の列であっても、000や101をこの表の文字としては復号できません。例えば「010 101 100」なら最初は鳥ですが、次の101は位置5で未登録です。残りの100が木に対応することは確認できても、全体を「鳥木」と断定せず、2番目のまとまりで復号が止まると答えます。
保存列の途中に余計なビットが1つ入った場合も考えます。固定長でも、その後の境界が自動で正しく保たれるとは限りません。先頭から3桁ずつ区切ると、挿入された場所より後では元と異なるまとまりを読むことがあります。たまたま登録済みの位置になっても、元の並びと一致する証拠にはなりません。元の記録と比較できるなら比較し、できなければ作成元に正しい列を確認します。
表では、復号する位置から文字を1つに定められるようにします。同じ位置に花と鳥を割り当てると、その位置に戻ってもどちらだったか決められません。符号化ができることと、復号して元に戻せることを別々に点検します。表の一部が欠けている場合も、残っている行の一致だけで表全体の正しさを決めないようにします。
標準例題:方式を変えて比較する
基本例題と同じ文字と位置の表を使います。方式Bは位置に1を足した値を3桁の2進数で表す自作規則です。「石花」を方式Aと方式Bで符号化し、それぞれ区切りを示して答えてください。どちらの結果も元の文字列へ復号してください。
石と花の位置は3、1です。方式Aではそのまま3桁にして「011 001」です。方式Bでは位置に1を足すので値は4、2となり、「100 010」です。方式Bを逆にたどると100は値4、010は値2で、各値から1を引いて位置3、1です。表で石、花に戻ります。方式Aも011と001を位置3、1として読み、同じ文字列に戻ります。
同じ文字と同じ位置を使っても、方式が異なるため保存列は異なりました。方式Bの「100 010」を方式Aとして読むと、位置4、2から「木鳥」になります。列が3桁ごとに整っていて、表の範囲内に収まっていても、間違った規則を使えば元の文とは違う結果になり得ます。成功したように見える復号結果も、用いた方式を確認して評価します。
方式Bで000を受け取った場合は値0から1を引くと負の位置になり、この表には対応がありません。「001 00」のように最後が2桁で終わる場合は、最後のまとまり自体が未完成です。未登録と桁不足は原因が異なるため、それぞれの箇所と理由を記録して送信元の条件や元データを確認します。勝手な補完は本来の文字を変えるおそれがあります。
発展例題:逆から条件を絞る
同じ表で、ある2文字のラベルを方式Aか方式Bのどちらかで記録したところ「010 011」になりました。使用した方式は不明です。それぞれの方式で復号し、元のラベルが一意に決まるか答えてください。
方式Aなら位置2、3なので「鳥石」です。方式Bなら値2、3からそれぞれ1を引き、位置1、2なので「花鳥」です。両方とも表に存在します。したがって列だけではどちらが元のラベルか一意に決まりません。方式Aで鳥石を再び符号化すると010 011、方式Bで花鳥を符号化しても010 011に戻ります。この往復で、2つの候補がどちらも与えられた条件に合うことを確かめられます。
追加で必要なのは、例えば記録時の方式を示す情報です。文字列の内容を推測して候補を選ぶことはできますが、推測だけでは条件から確定した答えにはなりません。一方、方式が明示されても表が不明なら、位置から文字を決められません。表と方式を両方共有することが往復の前提です。
誤答を直す:番号をそのまま読む
基本例題で「鳥花木の位置は2、1、4だから保存列も2 1 4」と答える誤りを考えます。文字から位置への対応までは合っていますが、位置からビット列へ変える規則が抜けています。図3のように、途中の位置で作業を止めず、方式Aの変換を1文字ずつ適用します。

図3の修正後は010 001 100です。これを3桁ずつ位置へ戻して表を逆引きし、鳥花木に戻ることも確かめます。位置を読み取る段階と列を作る段階のどちらで間違えたかを分ければ、修正箇所が見えます。
別の誤りは、末尾が欠けた列に0を加えて完成させることです。例えば010 00には、最後が000だったのか001だったのかを決める情報がありません。この表では前者は未登録、後者は花ですが、欠けたビットは判定できません。まず桁不足と答え、完全な列を確認します。表にない位置についても、近い番号の文字を選ぶ根拠はありません。
外部から表を受け取る場合も、受信が完了しなければ途中の表で変換を始めないようにします。例えば表の取得が時間切れになった場合は、完了していないことを示し、取得し直してから対応関係を確認します。読み込み中の例外や壊れた表で同じ位置に2文字が割り当てられている場合も、処理できた行だけから全体の復号を成功と判定しません。原因を記録し、正しい表を入手して再試行します。
練習問題
以下は練習専用の自作表です。文字「空」「海」「森」「雪」の位置を順に1、2、3、4とします。方式Cは位置を3桁の2進数にします。方式Dは位置に2を足した値を3桁の2進数にします。空白は区切りの表示で、ビットではありません。
- 「海雪空」を方式Cで符号化し、3桁ごとに空白で区切った列を答えてください。復号して元の文字列も示してください。
- 方式Dの「101 011」を復号し、文字列で答えてください。答えを再び方式Dで符号化して確認してください。
- 方式Cの「100 110 001」を復号しようとしました。各まとまりを調べ、全文を確定できるか、理由とともに答えてください。
- 方式Dの「100 01」を受け取りました。確定できる部分と、残りを確定できない理由を答えてください。最後に0を補ってよいかも述べてください。
- 方式Cか方式Dのどちらかで作った「011 100」があります。両方の候補を文字列で答え、方式が不明なときに必要な追加情報を述べてください。
練習の答えと確かめ方
-
位置は2、4、1ですから、方式Cの答えは「010 100 001」です。010、100、001をそれぞれ位置2、4、1に戻すと「海雪空」で、元の順番と一致します。先頭の0を落とすと3桁の境界が変わるため残します。
-
101は値5、011は値3です。方式Dでは2を引くので位置3、1となり、「森空」です。逆に位置3と1に2を足せば5と3になり、101 011に戻ります。文字の位置に2を足す規則と、復号で2を引く操作を対応させます。
-
100は位置4で雪、110は位置6で未登録、001は位置1で空です。2番目に対応する文字がないため全文は確定できません。雪と空を方式Cに戻すと100と001で、それぞれの部分は元の列に一致しますが、間の文字は埋まりません。未登録を飛ばして「雪空」とするのは全文の復元ではありません。
-
最初の100は値4で、2を引くと位置2、つまり海です。残りの01は3桁に足りず、そのままでは値を確定できません。最後に0を補えば010、1を補えば011になり、異なる値です。010は方式Dで位置0となり未登録、011は位置1で空ですが、どちらが元の列だったかは条件から決まりません。完全な列を確認します。
-
方式Cなら位置3、4で「森雪」です。方式Dなら値3、4から2を引き、位置1、2で「空海」です。森雪を方式Cで、空海を方式Dでそれぞれ符号化すると、どちらも011 100に戻ります。記録時にどちらの方式を使ったかという情報が必要です。列の見た目だけで方式を決めることはできません。
覚えておくこと
文字、符号位置、保存列を別の段階として扱います。
表は文字と位置を、方式は位置と列を結びます。
復号では逆向きにたどり、元の列と文字列を照合します。
未登録や桁不足を見つけたら、補わず条件を確認します。
どこで迷ったかを見分ける
答案が違うときは、まず文字の順に書いた位置が表と一致するかを見ます。位置が合っていれば、次に各まとまりの桁数と方式の操作を確かめます。列が合っていても復号時に別の方式を使えば違う文字になります。個別指導では、生徒が表のどの行を使ったかを指し示し、途中の位置と列を声に出して説明できるかを確かめます。欠けた列では、候補を作ることと元の文字を確定することの違いまで確認します。対応を往復する手順が、文字コードを読む根拠になります。
読んで終わりにするか、ここから変えるか。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。




