
二進数からテキストへの変換で文字が化ける本当の理由
公開日 2026年7月24日
0と1の並びは一見あいまいさがないように見える——二進数なのだから、解釈の余地などないはずだ。しかし実際には、二進数からテキストへの変換は16進数からテキストへの変換とまったく同じパターンで失敗する。根本的な理由も同じだ:ビット列は、どうグループ化してどう解釈するかについていくつかの前提を置かない限りテキストにはならず、その前提のどれか一つでも間違えると、特定の、診断可能な形で間違った出力になる。
原因1:ビットの区切り方が間違っている(7ビット vs 8ビット)
標準的なASCIIは1文字あたり7ビットしか必要としないが、ほとんどの二進数変換ツールはデフォルトで8ビット単位(1バイト)を使う。実際のシステムではテキストはそのように保存されているからだ。ある二進数の文字列が7ビット単位を前提にして生成されていて(一部の教科書の例や古いシステムでは今でもこうなっている場合がある)、それを8ビットのバイトとしてデコードすると、すべての文字が丸ごとずれてしまう——区切りの境界が最初のビットから間違っているため、文字化けは出力全体に均一に広がる。最初はきれいで途中から乱れるのではない。
見分け方:出力のすべての文字が文字通り間違っている場合(一部だけではなく)、まずビットの区切り方の前提を疑うべきで、他の可能性は後回しでいい。
原因2:ビットが1つ多い、または少ないと、それ以降すべてがずれる
これは16進数における「奇数桁」問題の二進数版だ——孤立した0や1が1つ多い(コピー&ペーストで紛れ込んだ余分な文字、抜け落ちた1桁、データとして誤って解釈された空白)と、その地点以降のすべてのグループのバイト境界がずれていく。原因1と違い、これはある地点までは正しく、そこから先が文字化けするテキストを生む——これは、エンコード方式自体が全体にわたって間違っているのではなく、文字列のどこかでビット数そのものがずれているという強いサインだ。
まず総ビット数を数えてみる:文字列の長さは、想定しているグループ化(通常は8、もし7ビット単位だと確認できているならその倍数)のきれいな倍数になっているはずだ。そうなっていなければ、余分な、あるいは足りないビットこそがバグであり、デコーダーの問題ではない。
原因3:文字エンコード、16進数の場合とまったく同じ
ビットが正しくバイトにグループ化されたとしても、そのバイト値が文字として何を意味するか——UTF-8か、ASCIIか、Latin-1か——をまだ決める必要がある。これは16進数からテキストへの変換の場合とまったく同じだ。マルチバイトのUTF-8文字(アクセント記号付きの文字、記号、非ラテン文字の文字体系)を、それぞれのバイトが独立した1文字であるかのように1バイトずつデコードすると、正しい1文字の代わりに2〜3個の文字化けした記号ができてしまう。ビットの区切り方が正しいと確認できていて(原因1と原因2を除外できていて)、それでも出力が非ASCII文字の周辺だけ特に間違っている場合、残る原因はほぼ常にこれだ。
原因4:テキストではなく数値を表す二進数の場合のエンディアン問題
その二進数文字列が文字データではなく数値——長さのプレフィックス、チェックサム、テキストと一緒に埋め込まれたID——を表している場合、ビット・バイトの順序が重要になり、しかも普遍的なデフォルトというものは存在しない。単独のバイトとしての00000001にはあいまいさはないが、マルチバイトの数値は、それを生成したシステムによって、最上位バイトが先に来る場合と最下位バイトが先に来る場合がある。間違った前提で読むと、明らかなエラーにはならず、もっともらしく見えるが実際には間違った、別の数値が静かに出力される。
順番に切り分けていく方法
- まず総ビット数が、想定しているグループ化(通常は8)のきれいな倍数になっているか確認する——数が合っていなければ原因2なので、まず入力を修正する。
- 最初からすべての文字が均一に間違っている場合は、エンコードを触る前に、まずグループ化のビット数そのもの(原因1)を疑う。
- 出力が最初はきれいで途中から乱れる場合は、まさにその位置で1ビットが余分か不足していること(原因2)を示しており、エンコードの問題ではない。
- グループ化とビット数の両方が確認できていて、非ASCII文字だけがおかしく見える場合は、文字エンコード(原因3)が原因だ。
- データがテキストではなく数値を表していて、値がもっともらしいが間違っているように見える場合は、変換ロジック自体が壊れていると決めつける前に、バイト順(原因4)を確認する。
16進数の場合と同じく、変換のステップ自体は些細なものだ——実際のバグはほとんどの場合、変換を行うコードそのものではなく、これら4つの前提のどれかに潜んでいる。