
武蔵野個別指導塾の特徴
高校情報I 文字化けの原因—書く側と読む側の対応表を照合して誤読を追う|武蔵野個別指導塾

自作の二つの表で同じビット列を読み、最初の相違を探します。文字の誤読と表示字形の不足を分けるのが判断の手掛かりです。
よくあるのは、高校生が掲示用の原稿を受け取り、見慣れない文字が現れたのでフォントを変えれば必ず直ると考える場面です。画面に見える形を変える操作は、文字を表示する字形が不足しているときの手掛かりになります。一方、保存されたビット列を別の対応で読み取っていたら、表示する前に別の文字が選ばれています。どの段階で食い違ったかを追うため、ここでは小さな自作の表を使います。
問題では何を追うか
出題の一つは、書く側の表と読む側の表、それにビット列が与えられ、最初に異なる文字を答える型です。書く側の文字列をそのまま読むのではなく、各まとまりを読む側の表へ当てます。先頭から比べて初めて違う位置と、その位置の両方の文字を示せば、判断の根拠が残ります。
もう一つは、表示がおかしい原因の候補を比べ、追加で必要な確認を答える型です。ビット列から選ばれた文字が意図した文字と一致するのか、それとも選ばれた文字を描く字形が表示側にあるのかを分けます。画面の見た目だけでは、両方の原因を必ず区別できません。元のデータ、使われた対応、表示環境を確かめる順序まで説明することが目標です。
条件が変わる型では、表の一部だけが一致している場合もあります。文字列の最初が正しく見えても、後ろの対応まで一致した証拠にはなりません。逆に、表が異なっていても、その文章で使われた符号についてはたまたま同じ文字になる場合があります。表全体の一致と、特定の列を読んだ結果の一致を区別します。
対応表と表示の段階
文字をデータとして保存するとき、書く側は文字を決められた規則に従ってビット列へ変換します。読む側は受け取ったビット列を規則に従って文字へ戻します。この変換をそれぞれ符号化、復号と呼びます。ここで用いる表は説明のための自作規則で、実在する文字コードの割当てではありません。
図1のように、文字からビット列へ進むときの表と、ビット列から文字へ戻るときの表が対応していれば、元の文字へ戻せます。途中の列が変わらなくても、読む側が別の表を使えば別の文字に対応することがあります。問題を解くときは、矢印の向きに注意して、符号化は文字から、復号はビット列から表を引きます。

図1の最後にある表示では、復号で選ばれた文字を画面上の形にします。フォントは文字を表示するための字形などを備えたものです。必要な字形がない場合には、文字が正しく選ばれていても、四角い印などに見えることがあります。ただし、印の種類や表示方法は環境によって異なります。四角が見えたという事実だけで原因を断定せず、選ばれた文字と利用可能な字形をそれぞれ確認します。
対応が食い違って別の文字へ復号された場合、フォントを変えても、その別の文字を描く形が変わるだけです。意図した文字へ戻すには、元のビット列と書く側の規則を手掛かりに、適切な規則で読み直します。読み違えた結果をさらに保存して元の列を失った場合は、見えている文字だけから元の内容を一意に決められるとは限りません。作業前の複製を残すことが、試行と復元を区別する助けになります。
このモデルでは各文字を2ビットで表し、左から2ビットずつ区切ります。表にない列があれば復号できないと扱います。実際の仕組みには長さの異なる符号や不正な列の扱いなど、さらに多くの条件がありますが、ここでは自作表の規則に限定して考えます。ビットが変わったか、区切りが正しいか、どの表を用いたかも別々に調べます。
基本例題:最初の相違を見つける
書く側の表Aは、00を「山」、01を「川」、10を「森」、11を「海」とします。読む側の表Bは、00を「山」、01を「森」、10を「川」、11を「海」とします。書く側が「山川海」を表Aで符号化し、その列を表Bで復号します。左から最初に違う位置と、そこで意図した文字と読まれた文字を答えてください。列は途中で変化せず、各文字は2ビットです。
図2のように、まず表Aで「山」「川」「海」を順番に00、01、11へ変えます。保存された列は00 01 11です。次に表Bで同じまとまりを読み、00は「山」、01は「森」、11は「海」となります。読む側の結果は「山森海」です。

図2を先頭から照合すると、1文字目はどちらも「山」です。2文字目は書く側の「川」に対して読む側が「森」なので、答えは2文字目、意図は「川」、読まれた文字は「森」です。3文字目は「海」で一致しますが、最初の相違は2文字目のままです。符号列を表Aへ戻すと「山川海」になり、出発点の文章と一致します。
この例でフォントの変更だけを試しても、表Bが01から選んだ「森」は「川」に変わりません。逆に、表Aで正しく「川」が選ばれていて、その字形だけが表示できないという条件なら、字形を備えたフォントを使うことが解決の候補になります。どちらの状態なのかを見極めるため、まず復号の結果を調べます。
標準例題:一致した部分を過信しない
表Aと表Bを基本例題と同じとします。書く側の文字列が「海山森川」のとき、表Aで符号化した列を表Bで復号した文字列と、最初に違う位置を答えてください。列は変化せず、2ビットずつ区切ります。
表Aを引くと、列は11 00 10 01です。これを表Bで読むと「海山川森」になります。1文字目の11と2文字目の00は両表で同じ文字に対応します。3文字目の10は、表Aでは「森」、表Bでは「川」なので、最初の相違は3文字目です。4文字目にも違いがありますが、最初の位置を答える条件とは区別します。
答えを戻して点検します。表Bの「海山川森」を表Bで符号化すると11 00 10 01となり、与えた列に戻ります。さらに同じ列を表Aで復号すると元の「海山森川」です。最初の2文字が一致した理由は、その2つの符号の割当てが両表で一致するからです。後ろまで正しいと推測したわけではありません。
発展例題:何があれば原因を絞れるか
ある原稿の元の文字列は「川山」、保存直後の列は01 00と記録されています。書く側は表Aを使いました。別の画面では「森山」と見えています。列は保存後に変化していないものとします。表Aと表Bのどちらを使えばこの表示文字列になるか、さらにこの情報だけで字形の不足を原因と断定できるか答えてください。
表Aで01 00を読むと「川山」、表Bで読むと「森山」です。したがって、提示された2表のうち、表Bによる復号は観察された文字列と一致します。表Bの「森山」を符号化すると01 00に戻るので、列と結果の対応も確認できます。一方、この観察だけで実際に表Bが使われたと確定することはできません。他の表や処理が同じ結果を生む可能性があるからです。
「森」と見えているという観察は、少なくともその画面上で何らかの形が描かれたことを示します。しかし、それだけで表示環境全体に字形不足がないとは言えません。実際に選ばれた復号規則を調べ、元の列の複製を適切な規則で読み直し、選択された文字と表示を比較します。元の列が得られない場合は、元の原稿や送信元の控えを探し、推測で上書きしないことが次の一手です。
誤答をたどって直す
基本例題で「最初から全部違う。フォントを変えれば元に戻る」と答えたとします。図3のように、これは結果の文字だけを眺め、各位置のビット列と対応表を結び付けていない誤りです。00は両表で「山」なので、先頭は一致します。01に進んだときに初めて「川」と「森」が分かれます。

図3の修正は、列を左から区切り、各表の対応を同じ位置で並べることです。次に、復号後の文字が違うのか、正しい文字を表示する字形がないのかを分けます。前者なら表の確認と読み直し、後者なら表示環境の確認が候補です。原因を確かめる前にフォントだけを変更すると、対応表の不一致を見逃します。
別の誤答は、誤って表示された文字を表Aで符号化し、その列を元の保存列だとすることです。基本例題の表示「山森海」を表Aで符号化すると00 10 11であり、元の00 01 11とは異なります。復号に使った表Bで符号化して初めて元の列へ戻ります。どの表をどちら向きに使ったかを答案に残せば、この取り違えを検出できます。
また、表Aと表Bが異なるから必ず文章全体が変わる、という判断も誤りです。「山海」なら00 11であり、両表とも同じ文字列を返します。この成功例は、両表が同じである証明ではありません。使っていない01と10の割当てが異なるため、別の文章では違いが現れます。
練習問題
次の5問は、各問の条件に従って答えてください。表Cは00を「赤」、01を「青」、10を「白」、11を「黒」とします。表Dは00を「赤」、01を「白」、10を「黒」、11を「青」とします。いずれも自作の固定長表で、列は左から2ビットずつ区切り、途中で変化しないものとします。
- 「赤青黒」を表Cで符号化した列と、それを表Dで復号した文字列を答えてください。
- 「黒赤白青」を表Cで符号化し、表Dで復号します。最初に異なる位置と、その位置の元の文字と読まれる文字を答えてください。
- 表Cで書いた列00 00を表Dで読みます。結果と、結果が一致することから表Cと表Dが同一だと言えるかを理由とともに答えてください。
- 表Cで書いた元の文字列が「白赤」で、画面には「黒赤」と見えます。表Cと表Dのどちらで列を復号すればその文字列になるか答え、実際の原因を絞るために必要な確認を1つ挙げてください。
- 表Cで復号した結果は意図した「青黒」と一致していますが、画面に最初の文字の形が表示されません。対応表の不一致と字形不足のどちらを優先して調べるか、理由と確認方法を答えてください。
練習の答えと照合
-
列は00 01 11、表Dでの結果は「赤白青」です。表Cで「赤」「青」「黒」に対応する列を順に並べ、同じ列を表Dで読みます。逆に「赤白青」を表Dで符号化すると00 01 11なので、途中の列へ戻ります。
-
表Cでの列は11 00 10 01、表Dでの結果は「青赤黒白」です。最初に異なるのは1文字目で、元は「黒」、読まれるのは「青」です。表Dの結果を同じ表で符号化すると11 00 10 01に戻り、表Cで復号すれば「黒赤白青」に戻ります。
-
結果は「赤赤」です。同一とは言えません。00の対応は一致しますが、例えば01は表Cで「青」、表Dで「白」です。結果を両表でそれぞれ符号化すると00 00へ戻るため、この列では違いが表に出ないことを確認できます。
-
表Cでは「白赤」が10 00となり、表Dではその列が「黒赤」になります。答えは表Dです。ただし、同じ結果になる別の処理もあり得るため、実際に使われた復号規則を確認します。表Dの「黒赤」を符号化して10 00へ戻し、元の条件と照合します。
-
字形不足を優先して調べます。指定条件では復号結果と意図した文字が一致しているため、表示の段階に注目できます。必要な字形を備えた表示環境で同じ復号結果を見比べます。それでも表示できなければ、別の表示条件やデータの取扱いも調べます。見た目だけで原因が確定したと考えず、復号結果が本当に「青黒」であることも元の条件に戻して確認します。
覚えておくこと
文字から列への符号化と、列から文字への復号の向きを分けます。
同じ列でも読む表が異なると別の文字になることがあります。
最初の相違は位置ごとに両表を照合して探します。
正しい文字を選べた後の字形不足と、復号の不一致は別に調べます。
読み直す前の元データを残し、結果を元の条件へ戻して確かめます。
どこで迷ったかを見分ける
答案で列が違うなら、書く側の表を文字から引けているか、区切りを保てているかを見ます。列が正しく結果だけ違うなら、読む側の表を列から引いたかを確認します。結果が正しくても対策の理由が曖昧なら、選択された文字と画面上の形を別々に指さして説明できるかが手掛かりです。
個別指導では、本人が作った対応表に矢印を書き込み、最初に異なる位置まで声に出してたどります。次に一致する列と一致しない列を1つずつ試し、同じ操作で元に戻せるかを見ます。表の相違、使った列、表示の条件を分けて記録すると、文字化けの原因を調べる道筋が残ります。
読んで終わりにするか、ここから変えるか。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。



