開発者ツール · テキスト比較
目に見えない違い: 非改行スペース、スマート引用符、および Unicode フォーム
· 仕組み
テキストの差分 ユニコード デバッグ
非改行スペースや中引用符からゼロ幅文字や分解されたアクセントまで、画面上では同じように見える行がバイトごとに異なる理由と、それらを見つける方法について説明します。
同一に見えるが、変更済みとしてフラグが設定されている 2 つの行 - 目に見える理由もなくレビューに失敗した翻訳ファイルが表示されます
変換行は、隣接する行とまったく同じようにレンダリングされても、比較に失敗する可能性があります。ブラウザのフォントは、コードポイントの境界を隠し、アクセントを組み合わせ、異なる句読点に類似の形状を割り当てます。 ToolAcre は、選択された大文字と小文字または空白文字の変換のみを行った後で JavaScript 文字列を比較するため、フラグが設定された行によって実際のテキストの区別が明らかになります。
キャラクターについての思い込みではなく、場所を信頼してください。疑わしい行をエディタにコピーすると、コード ポイントまたは 16 進数インスペクタが表示されます。 diff はどの行が異なっているかを示します。内部位置に注釈を付けたり、責任のある Unicode 値に名前を付けたりすることはありません。
非改行スペースとその関係 - ワード プロセッサが挿入する U+00A0 およびその他のスペース文字と、プレーン スペースがそれらに一致しない理由について説明します。
U+00A0 非改行スペースは、U+0020 通常のスペースと同じ文字ではありません。通常モードでは、それらの回線キーは区別されたままになります。 [空白を無視] では、空白ランの置換により、トリミング後にそれらのランが通常のスペースに縮小され、そのような違いの一部が消えてしまいます。
このオプションは一致する変換であり、Unicode クリーンアップ コマンドではありません。表示される同じ行は元の左側のテキストを保持し、修正された文書は作成されません。パブリッシング システムが非改行スペースを必要とする場合、正規化された一致により、意図的なレイアウト指示が修正されるのではなく、隠蔽される可能性があります。
ホワイトスペース モードでは Unicode のホワイトスペースが折りたたまれる可能性があります。通常の比較では個別の文字が保持されます
直線のアポストロフィおよび引用符は、活版印刷の開始形式および終了形式とは異なります。大文字と小文字を無視しても句読点は変更されず、空白の処理によって引用符が書き換えられることもありません。したがって、ワード プロセッサのオートコレクトでは、一見すると文が同じに見える場合でも、全行置換を行うことができます。
目的地に基づいて目的の句読点を選択してください。ソース コード、検索キー、およびデータ形式には正確な ASCII 文字が必要な場合がありますが、編集コピーでは活版印刷形式が好まれる場合があります。比較は違いを証明しますが、どちらが正しいかを判断するためのポリシーはありません。
ゼロ幅および方向文字 — 行をまだ何も変更していないものとして表示されるゼロ幅のスペース、結合子、および双方向マークをカバーします。
幅ゼロのスペース、結合子、および方向マークは、目に見えるグリフを描画せずに文字列の位置を占めることができます。 ToolAcre はテキスト コンテンツを使用して入力をレンダリングし、HTML の解釈を回避しますが、その安全なレンダリングによって隠れたコード ポイントが表示されることはありません。彼らは依然として通常のラインの平等に参加しています。
方向性のある動作により、視覚的な順序がストレージの順序に対する信頼性の低いガイドになる場合もあります。見覚えがあるという理由だけで、疑わしい混合方向フラグメントをシェル コマンドまたは識別子にコピーしないでください。何かを置き換える前に、専用ツールでコード ポイントと周囲のコンテキストを検査します。
合成アクセントと分解アクセント — アクセント付き文字を 1 つのコード ポイントとして、ベース文字と結合マークとして NFC と NFD の正規化を説明します。
アクセント付き文字は、事前に作成された 1 つのコード ポイントとして、または基本文字とそれに続く結合マークとして表すことができます。リポジトリには `normalize` への呼び出しが含まれていないため、標準的に同等に見えるフォームは異なる JavaScript 文字列のままであり、行の削除と追加を生成する可能性があります。
テスト スイートは、同一の Unicode 文字列が一致し、`café` が `cafe` と異なることを証明します。書記素を意識した比較を保証するものではありません。したがって、この記事ではバイト比較や Unicode の完全な同等性に関する主張を避けます。ライン アルゴリズムは文字列を受け取り、その変換されたキーを厳密に等しいかどうか比較します。
ツールは Unicode 正規化を実行しないため、合成アクセントと分解アクセントは異なるままになります。
リソース行が変更されていないように見えますが、フラグが立てられているとします。まずすべてのオプションをオフにして比較し、次に空白だけを切り替えます。行が等しくなった場合は、スペースと隠れた空白を検査します。変更されたままの場合は、行を繰り返し再入力するのではなく、引用符、結合マーク、その他のコード ポイントを検査してください。
文字インスペクターは、通常のスペースが予期される場所に U+00A0 を明らかにすることができます。フォーマットの要件を確認してから交換してください。翻訳されたコンテンツでは、非改行スペースは意図的な句読点規則である可能性があり、広範な検索と置換により、他の場所で正しいタイポグラフィが損なわれる可能性があります。
これでカバーされていないこと — 比較では行が異なることが報告されています。 Unicode 正規化を実行したり、文字を置換したりすることはありません
テキストの差分は、NFC または NFD の正規化、混同しやすいものの識別、ゼロ幅マークの削除、または修復された出力の生成を行いません。また、エンコードされたバイトも比較しません。これらは別個の操作であり、一般的なライン コンパレータが黙って選択すべきではない結果が生じます。
大文字と小文字を無視する場合は JavaScript `toLowerCase` を使用しますが、空白を無視する場合は一致するキーがトリムおよび圧縮されます。どちらの操作でも、ロケールを意識した照合や Unicode セキュリティ レビューは提供されません。出力は、識別子が安全または言語的に同等であることを証明するためではなく、調査を絞り込むために使用します。
要点: 差分を目で見て信じてください — フラグが立てられた行が実際の違いであると結論付け、ToolAcre のテキスト比較がどのように検査すべき行を特定するかを示します
サイトと差分が一致しない場合、文字列は検査に値するとみなします。このアルゴリズムには、フォントの整形によって騙される視覚的なモデルがありません。回線キーが表示されます。この制限は、ブラウザーがそれらを同じように描画するという理由だけで、隠れた差異が通過するのを防ぐため便利です。
最初に通常の比較を実行し、結果を変更するオプションを記録し、編集する前にコード ポイントを検査します。この証拠の痕跡により、空白の正規化が句読点や合成から分離され、異常な文字をすべて ASCII 近似に置き換えるという破壊的な習慣が回避されます。