Unicode制御文字(LRO, RLO)でコピー・改変を防止 (構想)
Unicode制御文字のうち、LRO(Left-to-right override, U+202D)とRLO(Right-to-left override, U+202E)は行中でも文字列の方向を変更する。
1行の中に何度もLROとRLOが入ると、カーソルキーが踊って楽しいことになる。
例えば、下のテキストの中でカーソルを動かしたり、文字列を選択しようとしても上手くできないはず。
※ Edgeは表示が崩れるので、Ctrl + A
→Ctrl + C
でメモ帳にコピペで確認可能。
表示上は普通のいろは順にひらがなが並んでいるように見えるが、 実際のデータはまったく違う順序になっている。
↓通常のテキスト (比較用)
作り方
行内の文字列の順番を入れ替えつつ、LROとRLOを交互に挿入。
以下のMathematicaコードで上記の例を作成した。
StringScrumble[str_String] := Module[{chars, chars2},
StringJoin[Riffle[(
chars = ToCharacterCode[#];
chars2 = Join[{16^^202e}, Riffle[chars, Reverse[chars]][[1 ;; Length[chars]]]];
FromCharacterCode[Riffle[chars2, {16^^202d, 16^^202e}]]) &
/@ StringSplit[str, "\n"]
, StringCases[str, "\n"]]]]
StringScrumble["いろはにほへとちりぬるを\nわかよたれそつねならむ\nうゐのおくやまけふこえて\nあさきゆめみしゑひもせす"]
各種デバイス・アプリでの表示
上記の文章をメールで送信し、各種端末で受信メールで表示してみた。
ChromeやFirefoxなどブラウザは狙い通り表示された。 Edgeはテキストボックス内ではダメだったが、それ以外の場所ではOK。 Outlookでの表示もOK。
iPhoneのメッセージ、メール、GmailはいずれもOK。
テキストエディタについてもどう表示されるか確認した。
メモ帳は意外にもちゃんとBiDi対応だった。 geditは行頭にRLOがあると右寄せで表示してしまう(こういう表示のほうが正しいかもしれないが)。
- Windows 10
- Edge:
- Outlook:
- メモ帳:
- Ubuntu 16.04
- Chrome:
- Firefox:
- gedit:
- iPhone
- 標準メール:
- メッセージ:
- Gmailアプリ:
課題と応用
交互にLROとRLOを入れていく単純な方法では、 文字列方向に「中立」な文字(スペースやカンマ、ピリオド、句読点など)を含む文字列は 上記のMathematicaコードでは上手く表示できない。
もし句読点を含むような通常の文章で、表示される文字列の順序と実際の文字列をバラバラにできれば、 部分的にコピーや編集することが難しくなるので、 メールや文章の無断引用や改ざんをされにくくできるのでは? (検索には引っかからなくなるが)
うまくできそうであればアプリとして公開したい。
Oct. 27 2022 追記
Unicode 6.5で追加されたRLI、LRI、PDIを使って空白などの中立文字を含む場合もシャッフルできることが判明。
ただし、長い行が折り返された場合はうまく表示できない。