そうでないテキスト

名前が示すように、等幅フォント(コードなど)を表示することを主なタスクとするテキストエディターは、同じ幅の文字を表示する必要があります。


diffの非表示のシンボル


しかし、ニュアンスがあります


Unicodeには、表示が許可されていない文字があります。 テキストエディタは、そのような文字を使用してテキストを単純にレンダリングするか、何らかのアクションを実行して目立たせることができます。


彼らは誰ですか?


コード役職
U + 2060foo⁠barワードジョイナー
U + 2061フーバー機能アプリケーション
U + 2062フーバー目に見えない時間
U + 2063フーバー見えないセパレーター
U + 180Efoo᠎barモンゴル語の​​区切り文字
U + 200Bフーバーゼロ幅スペース
U + 200Cfoo€€‌barゼロ幅非ジョイナー
U + 200Dフーバーゼロ幅ジョイナー
U + FEFFフーバーゼロ幅の休憩スペース

ワードジョイナーU + 2060

U + FEFFがBOM(バイトオーダーマーク、ファイルの先頭の数バイト、エンコードとバイトオーダーを示す)のエンコードに使用されたため、彼はゼロ幅のノーブレークスペース(U + FEFF)を置き換えました。 この文字は、発生する場所での行の折り返しを禁止します。


ゼロ幅の改行なしスペース、 U + FEFF

単語joinerに置き換えられた古いシンボルは、同じ目的で使用されました。


ゼロ幅ジョイナーU + 200D

インド語とアラビア語のフォントで使用され、それなしでは結合されなかった文字を結合します。


ゼロ幅の非ジョイナーU + 200C

合字を使用したスタイルでは、文字の間に挿入して合字がないようにすることができます。


ゼロ幅の非ジョイナー


キーボードにもあります:


鍵


ゼロ幅スペースU + 200B

スペースを挿入せずに単語の境界をマークする必要がある場合に使用します。 このテキストは単語を引き継ぎます:


単語単語単語単語単語単語単語単語単語単語単語単語単語単語単語単語単語単語単語単語


そして、これはそうではありません:


WordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWordWord


非表示演算子 :関数アプリケーションU + 2061 、非表示時間U + 2062 、非表示セパレータU + 2063

Unicode 3.2で追加されたInvisible Operators。 式で数学演算を示す必要があります。


たとえば、次のエントリ:A ij
2次元配列のインデックス(i、j)、または1次元のインデックスi * jを意味します。 あいまいさを解決するには、Invisible timesまたはInvisible separatorを使用して、意味を明確にします。


同様に、 f(x + y)は乗算または関数です。


視覚的には違いはありませんが、一部のパーサーは何を意味するのかを理解できます。


モンゴル語母音区切り記号、 U + 180E

名前から、それが何のためであるかは明らかです。 この記号は繰り返し問題引き起こしていますこの回答で非常によく説明されています


それはどのように見えますか


もちろん、表示はエディターだけでなくフォントにも依存するため、エディターの設定を変更せずにテキストのレンダリングを確認してください。


Atom、Sublime、VSCode、Xamarin Studio、XCode、Notepad ++:


テキストエディターの不可視


猫はそれらを表示しません:


猫の目に見えない


ただし、Linuxで-AオプションまたはmacOSで-vオプションを指定して実行すると、ほとんどすべての文字が表示されます(コメントのヒントをありがとう)。


 cat -v invisibles.txt U+2060 foo?M-^A?bar WORD JOINER U+2061 foo?M-^A?bar FUNCTION APPLICATION U+2062 foo?M-^A?bar INVISIBLE TIMES U+2063 foo?M-^A?bar INVISIBLE SEPARATOR U+180E foo?M-^Nbar MONGOLIAN VOWEL SEPARATOR U+200B foo?M-^@M-^Kbar ZERO WIDTH SPACE U+200C foo?M-^@?M-^@?M-^@M-^Lbar ZERO WIDTH NON-JOINER U+200D foo?M-^@M-^Mbar ZERO WIDTH JOINER U+FEFF foobar ZERO WIDTH NO-BREAK SPACE 

また、Vimは、リストの設定オプションがオンになっていても、一部の文字を報告しませんが、以下の方が優れています。


ターミナルで不可視


Web


GitHub、これはこれらの文字がプルリクエストと差分で表示される方法です:


githubの不可視


人気のあるコードエディターの1つであるCodeMirror:


コードミラーの不可視物


jsbinで使用されるのと同じCodeMirrorで、IEの一部の文字が表示されます。


コードミラーの不可視物


ACEはジャンクがあることを認識し、ここで何かが汚れていると言いますが、これは常に表示されるわけではありません。


エースの不可視物


コードエディターとdiffツール


IntelliJプラットフォームのエディター:


IntelliJのインビジブル


macOS用のさまざまなコード比較ツール(P4Merge、FileMerge、KDiff3):


差分の不可視


KDiff3、試行回数がカウントされましたが、これでは十分ではありません。


SourceTree:テキストをまったく処理しない、悪い:


SourceTreeの不可視


亀も、ほとんど何も:


差分の不可視


git diff :よくできて、すべてを表示し、それを強調表示しました(実際には、それを少なくしました)。 diffツールの場合、これはロールモデルです。


git diffのインビジブル


苦悩:そこにないBrainfuck


誰かが目に見えない文字のみを使用してアングィッシュプログラミング言語を作成しました。 これはBrainfuckに基づいてますが、 句読点は使用しませんが、上記で説明した文字は使用します。 Perl インタプリタと使用さえあります。


運営


悪いコード、そのようなこと、ブックマークを作ることは非常に簡単です:


 function f() { //   ,    return 'access_denined'; } let code = f(); if (code === 'access_denied') { return 401; } 

どうする


きれいなコード、%username%を記述します。 ベストプラクティスに従って、それらはそのように発明されただけでなく、そのようなものにタイムリーに気付くことを含めて、より少ないことを念頭に置くために考案されました。 魔法のライン、奇妙なまたはチェックされていないデフォルトのケース、何か他のものを見ました:時間があります-怠けてはいけません。 コードレビューを実施し、カブのコミットを確認し、適切なカバレッジを維持します。 行は画面に表示されるものだけでなく、疑いがある場合は16進エディタで確認してください。


一般に、一般的に、目に見えない文字を介してバックドアを実装する可能性がありますが、そうではありません:それを見つけるのは非常に簡単であり、他の方法を使用してgovnokodにブックマークを挿入できます。


読む




Source: https://habr.com/ru/post/J311518/


All Articles