テキストの正体と、ツールによって結果が食い違う理由
テキストファイルはバイト列と文字コードの組み合わせですが、文字コードはファイルの中に保存されていません。あるバイトが「é」を意味すると、慣習以外に教えてくれるものはないのです。だから同じファイルが、ある場所では正しく開き、別の場所では「é」と表示されます。UTF-8は現代の答えで、一般的なラテン文字を1バイト、アクセント付きの文字を2バイト、中国語・日本語・アラビア語の大半とすべての絵文字を3〜4バイトで保存します。UTF-16はWindowsとJavaScriptが内部で使う文字コードで、ほぼすべてを2バイト、残りを4バイトで保存します。Windows-1252とLatin-1は古いシステムが今も出力する1バイトの文字コードで、文字化けのよくある原因です。これらのページについて知っておいてほしいのは、CSVビューアーはドロップしたファイルの文字コードをUTF-16やWindows-1252も含めて判別し、手動で変更することもできる点です。プレーンテキストの入力欄はそうではありません。ドロップしたファイルはUTF-8として読み込まれるので、Latin-1で書き出したファイルはアクセント付きの文字が正しく表示されません。先に変換してから使ってください。
「文字」には4つの意味があり、どれが必要かは制限をかける側次第です。人が1文字として見るものは書記素クラスタです。正規表現がマッチするのはコードポイントです。JavaScriptのstring.lengthが返すのはUTF-16の単位数です。データベースの列やHTTPヘッダーが測るのはUTF-8のバイト数です。普通の英語ならこの4つは一致するので誰も気づきません。ところが家族の絵文字は、書記素では1、コードポイントでは7、UTF-16単位では11、バイトでは25になり、200文字のメッセージが255文字の欄で拒否されることになります。文字数カウントが4つすべてを表示するのは、まさにこのためです。
見えない文字も本物の文字です。ノーブレークスペースは普通のスペースとまったく同じに見えますが、まったく別の文字です。Webページやワープロからコピーしたテキストには頻繁に紛れ込み、検索、CSVの解析、スペースで区切るコードを壊します。ゼロ幅接合子は、複数人の絵文字をひとつにつなぎとめているものです。ソフトハイフン、方向制御文字、バイトオーダーマークも、貼り付けたテキストと一緒についてきます。どれも画面には表示されないので、手がかりは見た目と合わないカウントだけです。これは文字数カウントの正当な使い道のひとつです。なお、テキスト比較の空白を無視するオプションは、通常のスペースとタブをまとめて扱うものです。ノーブレークスペースはスペースとして扱いません。両者は同じ文字ではないからです。
差分ですべての行が変更されたように表示されることがあるのは、改行コードが原因です。Windowsは行末をキャリッジリターンとラインフィードで表し、それ以外はラインフィードだけを使います。LFのファイルをWindowsのエディタで保存すると、すべての行が見えない1バイト分だけ変わります。そのため、git diffやdiff(1)のようなバイト単位の比較はファイル全体が書き換えられたと報告し、実際に加えた1か所の変更が埋もれてしまいます。当サイトのテキスト比較と重複行削除は、比較の前に3種類の改行コードすべてで行を区切るので、改行コードが変わっただけのファイルが一面の赤で表示されることはありません。これは閲覧用のツールでは便利ですが、リポジトリでは落とし穴になります。エディタやgit自体の改行コード設定で、元から直してください。
同じに見える2つの文字列が違うと判定されるのは、たいてい正規化が原因です。Unicodeでは「é」を2通りに書けます。1つのコードポイントとして書くか、普通の「e」の後に結合用のアキュートアクセントを続けるかです。表示は同じでもバイト列は異なるので、比較、重複排除、データベースの検索では2つの別の値として扱われます。macOSとWindowsはファイル名にどちらの形式を使うかで昔から食い違っていて、2台のマシンから集めたリストに、完全な重複に見えるのに重複排除できない項目が生まれるのはそのためです。これを見つけるには文字数カウントを使います。2つの形式は書記素の数が同じで、コードポイントの数が異なります。これらのツールはどれも形式間の変換は行いません。それはPythonのunicodedata.normalizeのようなUnicodeライブラリを使えば、スクリプト1行で済む作業です。
「単語数」は測定ではなく判断です。空白で区切るのは英語のルールで、単語の間にスペースを入れない中国語、日本語、タイ語に当てはめると、長い記事が1語と報告されます。当サイトのカウンターはその代わりにブラウザのUnicode単語分割を使い、どの文字体系でも単語の始まりを判別します。残る食い違いは、ハイフン(「well-known」はここでもWordでも1語ですが、ツールによっては2語)、単独の数字、そして何を1文と数えるかです。「We met Dr. Smith」は1文ですが、単純な分割では2文になります。読了時間はさらにその上に重ねた推定値で、ブログ記事の間でコピーされ続けている切りのいい数字ではなく、メタ分析に基づく黙読で1分あたり238語を使っています。
ブラウザが本当に適さない場面
このカテゴリのツールは何も送信せず、何も保存しません。だから未公開の下書きや社外秘のソースコードも安心して貼り付けられます。一方でそれが上限を決めてもいます。作業の途中で気づくより、どこに上限があるのかを先にお伝えします。
大きなファイル。テキスト全体がタブのメモリに保持され、入力するたびに調べ直されます。数MBなら快適ですが、数百MBのログファイルはそうはいきません。スマートフォンはノートパソコンより早く限界に達します。コマンドラインにはこの問題がありません。ストリーミングで処理するからです。grepとripgrepはメモリより大きなファイルも検索でき、sedとawkは1行ずつ変換し、uniqueフラグ付きのsortはディスクを使いながら数千万行のリストの重複を削除します。どれも無料で、macOSとLinuxには最初から入っています。
大きく異なる文書。テキスト比較は差分が8,000か所に達すると止まります。それを超えるとアルゴリズムのメモリ消費が急増してタブが固まるうえ、そこまで大きな差分はどのみち読めないからです。同じ文書の2つのバージョンなら、ほぼ上限に届きません。無関係な2つの文書なら、すぐに届きます。コードのレビューには、diffやgit diffならどんなサイズでも扱え、本格的な3方向マージツールはこのページにはまったくできないことをこなします。
文字コードの変換、Unicodeの正規化。これらのページは読み込んで報告するだけで、文字コード間の変換は行いません。iconvはあらゆる文字コード間で変換でき、fileコマンドは手元のファイルの文字コードを推測し、Unicodeの正規化はPython 1行かICUのuconvで行えます。文字化けした書き出しファイルを修復するなら、それらのツール群を使ってください。
繰り返しの作業全般。これらのツールは人がクリックしたときに動きます。400個の文書の単語数を数える、コミットのたびにディレクトリを圧縮するといった作業はスクリプトやビルド工程の仕事です。特に圧縮なら、ビルドツールが同じ圧縮を、ソースマップ、監視モード、キャッシュ付きで行ってくれます。貼り付け欄にはできないことです。このページは、目の前にある1つのファイルのためのものです。
モダンなCSS。CSS圧縮は、ネイティブのネストや新しいメディアクエリの範囲構文を圧縮せずに拒否します。内部で使っている圧縮エンジンはどちらよりも古く、理解できないものを黙って削除してしまうからです。これは機能ではなく正直な拒否です。解決策は、先にSass、PostCSS、Lightning CSSでネストを展開しておくことで、お使いのビルドツールはおそらくすでにそうしています。
似た名前のツールの選び方
単語数カウントと文字数カウント。数え方は同じで、大きく表示する数字が違います。単語数カウントは単語数、文の数、段落数、読了時間を中心に表示します。エッセイ、記事、スピーチはこれで測ります。文字数カウントは文字数、スペースを除いた文字数、UTF-8のバイト数を中心に表示します。メタディスクリプション、SMSの分割単位、データベースの欄はこれで測ります。長すぎるとテキストを拒否されたなら、使うべきは文字数カウントで、特にそのバイト数です。
テキスト比較と重複行削除。テキスト比較は「この2つのバージョンで何が変わったか」に答えるもので、2つのテキストが必要です。重複行削除は1つのリストを対象に「この中で2回以上出てくるものは何か」に答えます。どの項目が何回重複したかを表示したり、item2がitem10より前に来るよう自然順で並べ替えたり、ちょうど1回だけ出てきた行だけを残したりもできます。2つのリストのうち片方にしかない項目を見つけるのは、比較ツールではなく重複行削除の仕事です。
HTML圧縮、CSS圧縮、JavaScript圧縮。3つの言語に3つの圧縮ツールがあり、知っておきたい重なりが1つあります。HTML圧縮は、styleブロック内のCSSとscriptブロック内のJavaScriptも、ほかの2つのページと同じ方法で圧縮します。つまり1つのHTMLファイルなら必要なツールは1つで、3つではありません。独立した.cssファイルや.jsファイルには、それぞれのページを使ってください。
XMLビューアーと、XML整形・XML構文チェック。ここにあるビューアーは、折りたためるツリーで内容を探れるようにします。文書が大きく、何かを探しているときに向いています。開発者ツールにある整形と構文チェックは、ファイルに貼り戻せるインデント付きのテキストと、壊れている箇所の正確な行と列を示します。読むためか、編集して直すためかの違いです。
CSVビューアーと、Excelでファイルを開くこと。競合するツールではありませんが、人が実際に比べているのはこの2つです。Excelは開くときに断りなく変換します。00123という商品コードは123に、5-3という部品番号は5月3日に、長い注文番号は指数表記になり、ドイツのシステムから書き出したセミコロン区切りのファイルは全部A列に入ってしまいます。ビューアーはすべての値を保存されたとおりのテキストで表示するので、実際に何が送られてきたのかを確認できます。
MarkdownプレビューとMarkdown PDF変換。プレビューは、READMEがGitHubでの表示どおりにレンダリングされるかを、入力しながらリアルタイムで確認するためのものです。ドキュメントツールにあるMarkdown PDF変換は、改ページ付きの完成した文書を作るためのものです。ここで確認して、あちらで仕上げてください。