テキストインバーター:文字を瞬時に反転させる
テキストインバーターは、最大1万文字までの任意の文字列を1文字ずつ反転させる無料オンラインツールです。絵文字やアクセント記号、さまざまな文字体系をそのまま保持しながら文字の順序を逆転させることができ、回文かどうかの確認や、鏡文字風のテキスト作成、SNS投稿の遊びにも使えます。
テキスト反転ツール
以下に任意のテキストを入力または貼り付けると、文字の順序をすぐに反転させることができます。入力中にリアルタイムで結果を確認できます。
ドキュメンテーション
テキスト反転ツールとは?
テキスト反転ツールは、テキストの文字の順序を逆にするツールです。「hello」と入力すると「olleh」になります。入力の最後の文字から最初の文字まで、すべての文字を逆向きに並べます。逆向きのテキストを作ったり、単語が回文かどうかを調べたり、プログラミングにおける文字列反転の仕組みを学んだりするために使われます。
テキスト反転ツールの使い方
- 入力欄にテキストを入力または貼り付けます。
- 入力を止めると、反転したテキストがすぐ下に表示されます。ボタンを押す必要はありません。
- コピーのボタンを押して結果をコピーします。
リセットボタンを押すと、入力欄と結果の両方が消去されます。このツールで扱えるのは最大10,000文字までで、それより長い入力にはテキストを短くするよう求めるエラーメッセージが表示されます。この上限は、ブラウザがテキストを保存する小さな単位であるUTF-16コードユニットで数えるため、ほとんどの絵文字は二文字分として数えられます。
テキスト反転の公式
という文字で構成された長さ n の文字列では、反転した文字列は次のようになります。
簡単に言えば、最後の文字が最初の文字になり、最後から2番目の文字が2番目になり、最初の文字が最後になるまでこの手順を続けます。
アルゴリズムの仕組み:手順
- 空の結果から始めます。
- 入力の最後の文字を取り出し、結果に追加します。
- 最後から二番目の文字を取り出して追加します。
- すべての文字が逆順で追加されるまで繰り返します。
多くの反転ツールは、コンピューター上の個々の文字単位で処理します。このツールは、書記素クラスター分割と呼ばれる方法で、絵文字、国旗、アクセント付き文字をそれぞれ一つのまとまりにしてから反転します。これが重要な理由は、下の節で説明します。
計算例
入力:Hello, World!
反転後:!dlroW ,olleH
コンマ、空白、感嘆符を含むすべての文字は、それぞれの特徴を保ちます。変わるのは順序だけです。
絵文字、アクセント、その他のUnicode文字の処理
絵文字やアクセント付きの文字のように、見た目には一文字のものが、内部では複数の見えない単位として保存されていることがよくあります。Unicodeでは、見た目の一文字を"user-perceived character"(ユーザーが一文字と感じる文字)または書記素クラスターと呼び、複数のコードポイントで構成されることがあります。コードポイントとは、文字やアクセント記号単体など、番号が付けられたUnicodeの一文字のことです。ブラウザーは、ほとんどの絵文字を含む多くのコードポイントを、さらに小さな二つのコードユニットとして保存します。どの単位が一組なのかを考慮せずに、これらの単位を一つずつ逆順にする方法では、文字が分解されてしまうことがあります。
たとえば、「Hello 👍」には、2つの隠れた単位から構成された親指を立てた絵文字が含まれています。単位ごとに反転する基本的な方法では、その2つが分離し、絵文字ではなく壊れた記号になることがあります。このツールは、各絵文字、国旗、アクセント付き文字を1つの単位として扱うことで、この問題を避けます。そのため、「Hello 👍」は正しく「👍 olleH」になります。国コードを表す2つの隠れた記号から構成される国旗の絵文字もそのまま保持され、「🇺🇸 USA」は国旗を分割せずに「ASU 🇺🇸」へ反転されます。
主な用途
- 回文の判定:回文は、前から読んでも後ろから読んでも同じになる語で、「racecar」などがその例です。単語とその反転結果を比較することで、回文かどうかを判定できます。
- コーディングの学習:文字列の反転は、ループ、配列、スタックの練習に使われる一般的な課題です。
- 言葉遊びとパズル:パズルや脱出ゲームでは、メッセージを隠すために反転した単語が使われます。
- デザイン効果:鏡像ロゴや視覚効果のためにテキストを反転するデザイナーもいます。
- デバッグ:順方向のテキストと反転したテキストを比較すると、特定のデータエラーを見つけやすくなることがあります。
文字の反転と単語の反転
この2つの操作は、よく混同されます。
- 文字の反転(このツールが行う処理):すべての文字を反転します。"Hello World"は"dlroW olleH"になります。
- 単語の反転:各単語はそのままにして、単語同士の順序を変えます。"Hello World"は"World Hello"になります。
短い歴史
反転文字や鏡文字は、コンピューターより数千年も前から存在していました。古代ギリシャの碑文には、牛が畑を耕す動きに似て、行ごとに左から右、次に右から左へと方向を交互に変える牛耕式という書式が使われているものがあります。レオナルド・ダ・ヴィンチは、鏡にかざしたときにしか読めない鏡文字で、ノートの多くを書きました。これが秘密を守るためだったのか、左利きの書き手として書きやすかったからなのか、インクのにじみを防ぐためだったのかについては、現在も歴史家の間で議論があります。
コンピューティングでは、文字列の反転はコンピューターサイエンスの初期から標準的なプログラミング演習でした。文字をスタックに積み、取り出すと順序が自動的に逆になるため、スタックや配列の仕組みを教える際によく使われます。
コードでテキストを反転する方法
ほとんどのプログラミング言語には、文字列を反転する組み込み機能または簡単な方法があります。
1text = "Hello, World!"
2print(text[::-1]) # !dlroW ,olleH
31const text = "Hello, World!";
2console.log([...text].reverse().join('')); // !dlroW ,olleH
3どちらの例も、通常の文字や数字、そして🌍のような単一ユニットの絵文字であれば、正しく反転できます。しかし、一部の国旗の絵文字、アクセント記号を別に入力したアクセント付き文字、特殊な連結文字でつないだ家族の絵文字など、複数の見えない単位でできた文字は、分断されることがあります。このツールが採用している、書記素単位で安全に反転する方法には、JavaScriptのIntl.Segmenterのような専用の関数が必要です。
処理性能
テキストの反転にかかる時間は線形です。アルゴリズムは各文字をちょうど一回調べるため、入力が二倍になると処理量もおよそ二倍になります。単語一つから数ページ程度までの通常のテキストなら、結果は実質的に瞬時に表示されます。メガバイト単位以上の非常に大きなファイルは、すべてを一度にメモリへ読み込まず、データをストリーム処理する専用プログラムで扱うほうが適しています。
よくある質問
オンラインでテキストを反転するには?
上の入力欄にテキストを貼り付けるか入力します。入力を止めると、反転したテキストが自動的に表示されます。コピーのボタンを使って結果をコピーします。
テキストの長さに上限はありますか?
はい。このツールは最大10,000文字まで扱え、UTF-16コードユニットで数えるため、絵文字は通常二文字分になります。それより長い入力では、結果の代わりにエラーメッセージが表示されます。
単語を反転するのですか、それとも文字だけですか?
単語の順序ではなく、個々の文字を反転します。"Hello World"は"dlroW olleH"になり、"World Hello"にはなりません。
絵文字や英語以外のテキストにも対応していますか?
はい。絵文字、国旗、アクセント付き文字を1つの単位として扱うため、反転後も分割されません。中国語、アラビア語、キリル文字など、あらゆる文字体系にも対応しています。
テキストを2回反転すると、元に戻りますか?
通常のテキストであれば、元に戻ります。反転した文字列をもう一度反転すると、元の文字列になります。このような性質を持つ関数は、対合と呼ばれます。まれに、先頭に単独のアクセント記号があるテキストなどでは、最初の反転後に別の書記素クラスターとして結合されることがあり、その場合は二回目の反転で完全には元に戻りません。
反転したテキストは暗号化に役立ちますか?
いいえ。文字の反転に安全性はありません。テキストを見た目上隠すだけなので、反転し直せば誰でも読めます。
参考文献
- The Unicode Consortium。Unicode Standard Annex #29: Unicode Text Segmentation。UAX #29 — 複数のコードポイントでできた書記素クラスター("user-perceived characters")、および一組に保たれる国旗シーケンスについて。
- MDN Web Docs。Intl.Segmenter。MDN: Intl.Segmenter — 文字列を書記素、単語、文に分割するJavaScriptのAPI。
- MDN Web Docs。String: length。MDN: String length — JavaScriptの文字列の長さはUTF-16コードユニットで数えられ、一文字が一つまたは二つ分になることがある。