2進数からテキストへ:バイトを復号し、できないときを知る
この変換でわかること
2進数のバイト列を読み、UTF-8のテキストとして復号します。8ビットで1バイトになり、1文字が複数のバイトにまたがることがあるため、バイト列はまとめて復号しなければなりません。実際の作業の山場はここで、バイトの境界は文字の境界を何も教えてくれません。
復号器は文字の終わりをどう知るのか
各バイトの先頭ビットがその役割を告げます。0で始まるバイトは単独、110で始まれば2バイト文字の先頭、1110なら3バイト文字、11110なら4バイト文字の先頭であり、継続バイトは10で始まります。この規則があるから、文字の位置を教えられなくてもバイト列を先へ進めます。
2進数とテキストの変換表
バイト列と、それが復号される文字です。複数バイトの行では先頭ビットの規則が働いている様子がわかり、最後の行では印刷可能な文字にならない生のバイトがどう見えるかを確かめられます。
| 2進数 | テキスト |
|---|---|
| 01000001 | A |
| 01100001 | a |
| 01001000 01101001 | Hi |
| 01001111 01001011 | OK |
| 00110001 00110010 00110011 | 123 |
| 11100100 10111000 10101101 | 中 |
文字化けが生まれる場所
文字化けの原因はほとんど、間違った符号化で復号したか、ずれた位置で切ったかのどちらかです。UTF-8を1バイト文字の符号化として復号すると、3バイトの文字が無関係な記号3つになり、先頭を1バイト落とせば以降の文字がすべてずれます。どちらも意味不明な記号の羅列に見え、バイト列を見ることで初めて診断できます。
バイトの区切りを崩さない
8桁の組をまるごとコピーしてください。バイトの途中から貼り付けると、復号器が解釈できない並びになり、そのあとのエラーは正確でも、貼り付け位置が原因だとは分かりません。
よくある質問
2進数からテキストへ戻す手順は?
2進数を8桁ずつの組に分け、各組を1バイトとして扱い、そのバイト列をUTF-8として復号します。英字のAは01000001なので、1つの組がそのまま1文字になります。長い並びなら文字列になり、複数の組にまたがる文字も現れます。
変な記号ではなくエラーが出るのはなぜですか?
そのバイト列が正しいUTF-8ではないからです。途中で切れている、順序がおかしい、そもそもテキストではない、といった理由が考えられます。置換文字を出す代替案では、本当は文字でないバイト列まで復号の問題に見えてしまうため、あえて拒否しています。
バイトの間に空白がなくても復号できますか?
できます。長さが8の倍数である連続した並びは自動的にバイトへ分割されるので、区切りを省いた形でコピーしても整え直す必要はありません。空白入りと連続した形は同じ意味です。
単独で127を超えるバイトは何を意味しますか?
そのバイト自体が1文字なのではなく、複数バイトの文字の一部であることを意味します。その範囲のバイトが単独で現れてもUTF-8としての意味は持たず、本ツールは正しく拒否します。属していた文字が不完全だからです。
日本語以外の言語でも使えますか?
UTF-8で表せるものなら何でも使えます。現在使われているほぼすべての文字体系が該当し、ラテン文字やキリル文字、アラビア文字、中国語、韓国語、絵文字も含まれます。当サイトのテキストから2進数への変換で作った並びは、必ず元のテキストに戻ります。