名前が示すように、等幅フォント(コードなど)を表示することを主なタスクとするテキストエディターは、同じ幅の文字を表示する必要があります。
しかし、ニュアンスがあります
Unicodeには、表示が許可されていない文字があります。 テキストエディタは、そのような文字を使用してテキストを単純にレンダリングするか、何らかのアクションを実行して目立たせることができます。
彼らは誰ですか?
コード | 例 | 役職 |
---|---|---|
U + 2060 | foobar | ワードジョイナー |
U + 2061 | フーバー | 機能アプリケーション |
U + 2062 | フーバー | 目に見えない時間 |
U + 2063 | フーバー | 見えないセパレーター |
U + 180E | foobar | モンゴル語の区切り文字 |
U + 200B | フーバー | ゼロ幅スペース |
U + 200C | foo€€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、これはこれらの文字がプルリクエストと差分で表示される方法です:
人気のあるコードエディターの1つであるCodeMirror:
jsbinで使用されるのと同じCodeMirrorで、IEの一部の文字が表示されます。
ACEはジャンクがあることを認識し、ここで何かが汚れていると言いますが、これは常に表示されるわけではありません。
コードエディターとdiffツール
IntelliJプラットフォームのエディター:
macOS用のさまざまなコード比較ツール(P4Merge、FileMerge、KDiff3):
KDiff3、試行回数がカウントされましたが、これでは十分ではありません。
SourceTree:テキストをまったく処理しない、悪い:
亀も、ほとんど何も:
git diff
:よくできて、すべてを表示し、それを強調表示しました(実際には、それを少なくしました)。 diffツールの場合、これはロールモデルです。
苦悩:そこにないBrainfuck
誰かが目に見えない文字のみを使用してアングィッシュプログラミング言語を作成しました。 これはBrainfuckに基づいていますが、 句読点は使用しませんが、上記で説明した文字は使用します。 Perl インタプリタと使用例さえあります。
運営
悪いコード、そのようなこと、ブックマークを作ることは非常に簡単です:
function f() { // , return 'access_denined'; } let code = f(); if (code === 'access_denied') { return 401; }
どうする
きれいなコード、%username%を記述します。 ベストプラクティスに従って、それらはそのように発明されただけでなく、そのようなものにタイムリーに気付くことを含めて、より少ないことを念頭に置くために考案されました。 魔法のライン、奇妙なまたはチェックされていないデフォルトのケース、何か他のものを見ました:時間があります-怠けてはいけません。 コードレビューを実施し、カブのコミットを確認し、適切なカバレッジを維持します。 行は画面に表示されるものだけでなく、疑いがある場合は16進エディタで確認してください。
一般に、一般的に、目に見えない文字を介してバックドアを実装する可能性がありますが、そうではありません:それを見つけるのは非常に簡単であり、他の方法を使用してgovnokodにブックマークを挿入できます。
読む
- Unicode Demystified、実用的なプログラマー向けエンコーディング標準ガイド、Richard Gillam(参照先を知っています)は、ユニコードについての良い本です。