テキスト / 2 進数変換

テキストを 2 進数へ、2 進数をテキストへ。UTF-8 のバイトを 1 バイトずつ 8 桁で書き、場違いな文字があればその行と列を示します。

入力
出力
11100011 10000001 10010011 11100011 10000010 10010011 11100011 10000001 10101011 11100011 10000001 10100001 11100011 10000001 10101111

テキストが 0 と 1 になるしくみ

コンピューターはテキストをバイトとして保存し、1 バイトは 8 ビット、その一つひとつが 0 か 1 です。このページはそのバイトを見せます。テキストを入力すると、どのバイトも 2 進数 8 桁として出てきて、バイトとバイトのあいだにはスペースが入ります。あるいは 2 進数を貼り付けて、それが綴るテキストを読むこともできます。どちらの方向にも働き、処理はすべてブラウザ内で行われ、開いた時点ですでに変換済みの例が表示されています。

テキストがどんなバイトでできているかはエンコーディングによって決まり、ここでは別のものを選ばない限り UTF-8 です。ウェブページも URL も、たいていのテキストファイルも、保持しているのは UTF-8 だからです。「単位」で選ぶのは、数字のグループ一つが何を表すかです。UTF-8 の 1 バイト、どちらかのバイト順で書いた UTF-16 の 1 バイト、またはコードポイント一つです。選んだ単位は読み書きどちらの方向にも適用され、ページがあなたに代わってそれを変えることはありません。貼り付けたものが別の単位のように見えるときは、ページがそう伝え、その知らせの横にボタンを置きます。そのボタンを押すまで、何も切り替わりません。

なぜ 1 バイトを 8 桁で書くのか

ビットは 2 進数の 1 桁で、バイトはその 8 つ分です。8 ビットの 0 と 1 の組み合わせは 256 通りあるので、1 バイトには 0 から 255 までの整数が入ります。0 は 00000000、255 は 11111111 です。ファイルもメモリもネットワークもバイトで数えられ、あなたが出会いそうなどのマシンでも 1 バイトは 8 ビットです。ネットワークの標準はこれをオクテットと呼びます。8 以外の意味にはなりえない語です。

そのうち最初の 128 の値が ASCII で、英語のアルファベット、数字、よく使われる句読点を表す符号です。そして 128 の値に要るのは 7 ビットだけです。ですから ASCII の文字のバイトはどれも 0 で始まり、UTF-8 は 1 で始まるバイトを、ASCII にないものすべてのために取ってあります。ページがどのバイトも、先頭のゼロも含めて 8 桁すべてで書くのには、実用上の理由もあります。幅が一定のバイトなら、あいだにスペースがなくても、8 桁ずつ読み戻せるからです。

文字 H を 1 ビットずつ

大文字の H を例にとります。ASCII での番号は 72 で、72 をバイトにすると 01001000 です。左から読むと、8 つの位の重みは 128、64、32、16、8、4、2、1 で、1 はそれぞれ自分の位の重みを数に加えます。このバイトは 64 と 8 の位に 1 があり、64 と 8 を合わせて 72 です。小文字の i は 105 で、これは 64、32、8、1 の和なので、Hi は 01001000 01101001 になります。

大文字か小文字かは 1 ビットの違いです。小文字の h は 01101000 で、H のバイトの 32 の位を立てたものです。英語のアルファベットのどの文字でも同じで、ASCII が各小文字に、その大文字よりちょうど 32 大きい番号を付けているからです。

「基数」は、同じバイトを変えずに別の書き方で書きます。「10 進数」を選ぶと H は 72、「16 進数」なら 48、「8 進数」なら 110 です。1 つのバイトを 4 通りに書いたもので、読み戻すときも、どの基数を選んでいても、その基数で数字を受け取ります。「テキスト / 16 進数変換」は「16 進数」で開き、そこでは 1 バイトが 8 桁ではなく 2 桁になります。

ASCII を超える文字が 2 バイト以上になる理由

ASCII は 127 で終わります。アクセント付きの文字、キリル文字・ヘブライ文字・アラビア文字、日本語や韓国語の文字、そして絵文字は、どれもその先にコードポイントがあります。UTF-8 が文字を 1 バイトで書くのは、それが ASCII のときだけで、1 で始まるバイトはそれ以外のすべてのために取ってあります。そのためこれらの文字はそれぞれ 2、3、4 バイトのどれかになり、そのさまを見られるのが 2 進数です。どのバイトも、最初のいくつかのビットが、そのバイトが文字のどの部分かを示しているからです。

  • 0xxxxxxx は 1 バイトの文字です。ASCII で、その 7 ビットが x の位置に書かれます。H は 01001000 です。
  • 110xxxxx 10xxxxxx は 2 バイトの文字で、2,047 までのコードポイントに使われます。ヨーロッパの言語のアクセント付きの文字と、キリル文字・ヘブライ文字・アラビア文字がここに入ります。é は 11000011 10101001、א は 11010111 10010000 です。
  • 1110xxxx 10xxxxxx 10xxxxxx は 3 バイトで、65,535 までのコードポイントに使われます。日本語の仮名とよく使われる漢字、韓国語のハングル、ユーロ記号はここにあります。€ は 11100010 10000010 10101100 です。
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx は 4 バイトで、それより先のすべてのコードポイントに使われます。絵文字の多くはここにあります。

1 が 2 つ、3 つ、または 4 つ続いて始まる最初のバイトは、その文字が何バイトあるかを示し、文字の続きを運ぶバイトはどれも 10 で始まります。ですから、文字の途中のバイトが文字の始まりと取り違えられることはありません。א の 2 バイトから目印の 110 と 10 を取り除くと、残る 11 ビット、10111010000 が、そのコードポイント U+05D0 を 2 進数で書いたものです。「16 進数」を選ぶと同じ 2 バイトは D7 90 と読め、パターンは数字の中に折り込まれます。2 進数では、どのバイトでも最初のビットにパターンがそのまま現れます。

絵文字 1 つに 4 バイト

😀 は U+1F600 で、65,535 をはるかに超えるので、UTF-8 はこれを 4 バイトで書きます。11110000 10011111 10011000 10000000 です。最初のバイトは 4 つの 1 で始まるので 4 バイトの文字の始まりとなり、その後の 3 バイトはどれも 10 で始まります。そのコードポイントは 2 進数で 17 桁、11111011000000000 で、3 バイトの文字に入る 16 桁より 1 桁多くなります。4 バイトのパターンには 21 桁分の余地があります。

1 つの記号に見える絵文字が、いくつものコードポイントでできていることがあり、そのどれもがまるごと書き出されます。肌の色を指定した、手を振る絵文字は、コードポイント 2 つで 8 バイトです。4 人家族の絵文字はコードポイント 7 つ、つまり 4 人と、そのあいだにある目に見えない 3 つのゼロ幅接合子で、25 バイトになります。1 つをページに貼り付けて、グループを数えてみてください。

ほかの変換ツールが א を 11 桁で出す理由

א に 11 桁の 10111010000 を出す変換ツールは、そのバイトを書いたのではありません。その変換ツールが書いたのは、Unicode がこの文字に与えた番号、つまりコードポイント U+05D0 である 1488 を、1 つの 2 進数にしたものです。その数は、ファイルやネットワークが保持するどんなもののバイトでもありません。そうして書かれたメッセージを読み戻せるのは、同じ前提に立つ読み手だけです。

2 つの答えは見た目ほど離れていません。上で見たとおり、その 11 桁は、目印を取り除いたあと UTF-8 が 2 バイトに分けて置くビットそのものです。ですから両方の変換ツールが同じ数を書いており、その数を格納するバイトを書くのは片方だけです。ASCII の文字では、両者は先頭のゼロを除けば一致します。だから素の英語では同じ答えになり、それ以外のほとんどすべてで食い違うのです。

このページもその答えを出します。ただし、ページが前提として置くのではなく、あなたが選ぶ単位としてです。「コードポイント」を選ぶと、א は 10111010000 と書かれ、同じように読み戻されます。コードポイントを書く変換ツールがヘブライ語、ロシア語、日本語で書いたメッセージを、UTF-8 を選んだまま貼り付けると、グループはバイトにしては幅が広すぎます。ページは推測せず、グループがコードポイントのように見えると伝えて、「コードポイントに切り替える」を示します。JavaScript の charCodeAt のように UTF-16 のコード単位を 1 つずつ扱う変換ツールは、😀 を 16 桁の数 2 つとして書きます。UTF-16 がこの絵文字を保存するときのサロゲートペアの、2 つの片割れです。「コードポイント」はそのペアを、1 つの絵文字として読み戻します。

2 進数からテキストを読み戻す

2 進数をテキストに戻すには、方向を「2 進数からテキスト」に切り替えて、数字を入力するか貼り付けます。出力は、その数字が綴るテキストです。「入力として使う」はそれをワンクリックで行い、出力を入力へ移して方向を切り替えます。往復を確かめるいちばん手早い方法です。次のものは、どれも同じバイトとして読まれます。

  • バイトのあいだにある、改行を含むあらゆる種類の空白と、カンマ、セミコロン、コロン、ハイフン。
  • 区切りがまったくないもの。数字が 8 桁ずつの完全なバイトに分けられるところならどこでもよく、「スタイル」の「区切りなし」はこの書き方です。
  • 7 桁以下のグループ。先頭のゼロを落とした ASCII の文字はこう見えます。1001000 1101001 は Hi と読まれます。
  • バイトの前の 0b(大文字でも小文字でも)と、全体を囲む 1 組の角括弧、波括弧、丸括弧、引用符。

ただし、推測はしません。それ以外の文字や、8 桁より長いのに完全なバイトに分けられないグループがあると、読み取りはそこで止まり、ページはそれがある行と列を示してそう伝えます。その下には、その場所に印を付けたあなた自身の行が表示されます。長いメッセージでは、これが、見つけられる打ち間違いと、黙って間違っているテキストとの違いになります。

バイトとしては問題なく読めても UTF-8 のテキストではない 2 進数は、拒否されずに表示されます。文字の途中で切れたメッセージは、壊れたバイト列が置換文字の U+FFFD として表示された形で戻ってきます。出力の下の知らせは、そうしたバイト列がいくつあり、最初のものがどこから始まるかを伝えます。そのバイト、それに対してあなたが貼り付けた数字、そしてその行と列です。

テキストの 2 進数と、数の 2 進数

ここで 5 と入力すると、答えは 101 ではなく 00110101 です。このページが書くのは、ASCII で 53 番の文字である 5 です。テキストの数字とは、それを格納するバイトのことだからです。101 は数の 5 を 2 進数で書いたもので、それは別の答えを持つ別の問いです。255 も同じで、ここで入力すると 3 文字、3 バイトですが、数の 255 は 11111111 という 1 バイトです。

手元にあるのがテキストではなく数、たとえば個数、レジスタ、プログラムが出力した値なら、持っていく先は「基数変換ツール」です。そのページは値そのものを 2 進数、8 進数、10 進数、16 進数、その他の基数のあいだで変換し、固定幅では負の値を 2 の補数で書き、どのビットもクリックで反転できるように表示します。このページはテキストの文字から出発し、あちらは数から出発します。

よくある質問

自分の名前を 2 進数で書くにはどうすればいいですか?
入力欄に入力すると、1 バイトずつ、1 バイト 8 桁で、バイトのあいだにスペースを入れて出てきます。たとえば Ada は 01000001 01100100 01100001 です。アクセント付きの文字や、ほかの文字体系の文字は 2 バイト以上になり、2 つの名前のあいだのスペースも、それ自体で 1 バイト、00100000 です。
1 文字は何ビットになりますか?
UTF-8 では、ASCII の英字・数字・句読点が 8 ビット、アクセント付きの文字やキリル文字・ヘブライ文字・アラビア文字が 16 ビット、日本語の仮名、よく使われる漢字、韓国語のハングル、ユーロ記号が 24 ビット、絵文字の多くが 32 ビットです。1 つの記号に見えるものが、その下ではいくつものコードポイントでできていることがあり、そのそれぞれが自分のビットを使います。
バイトのあいだにスペースのない 2 進数を貼り付けられますか?
はい。数字が完全なバイトに分けられるところならどこでも読めます。16 桁なら 2 バイト、24 桁なら 3 バイトです。8 桁より長く、長さが 8 の倍数でないグループは、どのバイトが桁を失ったのかを推測しない限り分けられないので、誤って読まれる代わりに、その行と列で拒否されます。
なぜテキストが、ひし形に入った疑問符を含んで戻ってくるのですか?
その記号は置換文字の U+FFFD で、バイトが UTF-8 のテキストでないところにページが置くものです。いちばん多いのは、バイトが失われて文字が途中で切れた場合と、そもそもバイトが UTF-8 ではなかった場合です。ページはメッセージ全体を拒否する代わりに、壊れたバイト列をそれぞれそのように表示し、出力の下で、それがいくつあり、最初のものがどこから始まるかを伝えます。貼り付けたものの中で、傷んだ箇所を見つけられるようにするためです。
ほかの変換ツールでは、どうして 2 進数が違うのですか?
おそらく、その変換ツールは各文字のバイトではなくコードポイントを書いています。両者は ASCII では先頭のゼロを除いて一致し、その先で食い違います。א はここでは 11010111 10010000、あちらでは 10111010000 です。その変換ツールの答えを得るには、あるいはそれが書いたメッセージを読み戻すには、「コードポイント」を選んでください。
ここでは 5 が 101 にならないのはなぜですか?
入力欄に入力した 5 は文字で、ページはそれを格納するバイト 00110101 を書くからです。数の 5 は 2 進数で 101 です。テキストではなく数には、「基数変換ツール」を使ってください。
私のテキストはサーバーに送られますか?
いいえ。どちらの方向も完全にブラウザ内で動くので、入力したテキストも、貼り付けた 2 進数も、端末の外に出ることはありません。

関連するツール

  • 基数変換ツール

    このページで 5 と入力すると、文字の 5 を格納するバイト 00110101 が表示されます。あちらのページはテキストではなく数のためのページで、値そのものを変換するため、数の 5 は 101 になります。

  • テキスト / 16 進数変換

    16 進数はバイトを 2 桁で書き、2 進数なら 8 桁かかります。Hi はこのページでは 01001000 01101001、あちらでは 48 69 です。ダンプはバイトをこう表示し、コードもこう書きます。このページでも 16 進数を選べますが、あちらのページは 16 進数で開きます。

  • Base64

    Base64 のエンコードとデコード — UTF-8 完全対応。

  • URL エンコード / デコード

    値や URL 全体をパーセントエンコード、その逆も。