文字数をカウント
スペースあり・なしの文字数に加えて、データベースやSMSゲートウェイが実際に測っているバイト数も表示。絵文字は実際そうであるとおり、1文字として数えます。
- 保存しません
- 順番待ちなし
- 登録不要・透かしなし
0
文字数
人が見たとおりの数
0
空白を除く
空白文字を除外
0
単語数
どの言語でも
0
UTF-8バイト数
データベースが数える数
- 行数エディターの行番号と同じ数え方
- 0
- 文の数「Dr.」や「etc.」で区切られません
- 0
- 段落数空行で区切られたまとまり
- 0
- コードポイント正規表現の「.」が一致する単位
- 0
- UTF-16単位JavaScriptのstring.lengthが返す値
- 0
- UTF-8バイト数VARCHARの上限やHTTPヘッダーが数える単位
- 0
- 読了時間黙読で1分あたり238語として計算
- —
- スピーチ時間音読で1分あたり150語として計算
- —
- 最長の単語バイト数ではなく文字数で
- —
- 単語の平均読みやすさの大まかな目安
- —
入力を始めると、すべての項目が表示されます。絵文字や中国語の文を試してみてください。どちらも人が数えるとおりに数えます。多くのカウンターはここを間違えます。
使い方
貼り付けまたは入力
カウントは入力に合わせて更新されます。何も保存されません。
必要なカウントを選ぶ
文字数、空白を除く文字数、コードポイント、UTF-8バイト数を、それぞれ何に使われるかと合わせて表示します。
上限をチェック
SEOタイトル、メタディスクリプション、SMSの分割数、255バイトのフィールドについて、入力した内容が上限に対してどうかを追跡します。
「文字」には4つの意味があるから、数値も4つ
家族の絵文字や、肌の色を指定した「いいね」の絵文字を例にとります。人が見れば1文字です。これは複数のコードポイントを見えない結合文字でつないで作られているため、正規表現では7になります。JavaScriptはテキストを16ビット単位で保存し、基本範囲外の文字は2単位を使うので、11と報告します。データベースの列用にUTF-8でエンコードすると25バイトになります。どの数値も間違いではなく、どれか1つが正解というわけでもありません。正しいのはどれかは、何が上限を設けているかで決まります。
つまり実際に問うべきなのは、誰が上限を設けたかです。VARCHARとして宣言されたデータベースの列は、多くのエンジンでバイト数を数えます。英語なら255文字入るフィールドに、日本語だとずっと少ない文字数しか入らないのはこのためです。SMSは独自の7ビット文字セットで160文字ですが、その範囲外の文字が1つでも入った瞬間、1通あたり70文字に減ります。カーリークォートや絵文字が1つあるだけで、1通のメッセージが3通になることもあります。JavaScriptのフォームのバリデーションは、ほぼ必ずUTF-16単位で数えます。「280文字」とあるフィールドが、絵文字だらけの、見た目はもっと短い文字列を拒否することがあるのはこのためです。
読み手が見る文字の数は最も難しく、ブラウザ自体のテキスト分割機能で数えています。左矢印キーを押したときにカーソルがどこへ移動するかを決めているのと同じ仕組みです。人が認識するものについては、これが「1文字」の正しい定義であり、単純な数え方ではつまずくケースも正しく扱えます。基本の文字と結合記号で書かれたアクセント付きの文字は1文字になり、ヒンディー語やタイ語の文字のまとまりは、その文字を読む人が数えるとおりに数えます。
一般的な英語の文章なら4つの数値はすべて同じなので、問題が表面化するまで気づかれません。絵文字、アクセント付き文字や結合文字、ラテン文字以外の文字体系、数学記号では、数値が食い違います。 そしてまさにこうした入力が、作ってから3か月後にデータベースのフィールドを黙って切り詰める原因になるのです。
ほかの目的には
コードでは、既定の長さではなく、必要なものを数える関数を使いましょう。JavaScriptのIntl.Segmenterは読み手が見る文字を数えます。Python 3の文字列はコードポイントを数え、len(s.encode("utf-8"))はバイト数を数えます。PHPには、まさにこの区別のためにmb_strlenとstrlenがあります。多くの言語の既定は、その言語にとって都合のよいものであり、あなたの上限が意味するものであることはまれです。
データベースのフィールドが制約になっているなら、根本的な解決策は上流にあります。MySQLで列をutf8mb4として、PostgreSQLでtextとして宣言すれば、切り詰めのバグをまとめてなくせます。MySQLの古いutf8は1文字3バイトまでしか扱えず、絵文字をまったく保存できないことでよく知られています。フォームで慎重に数えるのは、本来別の宣言にすべきだった列への応急処置にすぎません。
よくある質問
テキストはどこかに保存されますか?
いいえ。何も保存されず、通信も一切発生しないので、ネットワークを切断しても動作し続けます。テキストの場合、これは見た目以上に重要です。オンラインのカウンターに貼り付けられるのは、未発表の原稿、法律文書の下書き、学生の課題、社内文書だからです。
文字数が4種類あるのはなぜですか?
「文字」には4つの異なる意味があるのに、ほとんどのツールはそのうち1つしか知らないからです。あなたが1文字と見ているものは書記素クラスターで、「é」「🎉」、さらには「👨👩👧👦」もそれぞれ1文字です。JavaScriptのstring.lengthが返すのはUTF-16コード単位で、この家族の絵文字は11になります。正規表現が一致するのはコードポイントで、7になります。そしてデータベースの列やHTTPヘッダーが測るのはUTF-8の「バイト数」で、25になります。必要なのがどれかは上限を設けている側によって変わるため、ここでは4つすべてを表示しています。
絵文字は何文字ですか?
ここでは1文字です。読む人にとってはそれが実際の姿であり、最近のプラットフォームの文字数制限が数えるのもそれだからです。ほかでは2、7、11になることもあります。「👨👩👧👦」は4人の人物を3つの見えない結合文字でつないだものなので、コードポイントでは7、JavaScriptのstring.lengthが数える単位では11になります。十分短く見えるのにフォームで長すぎると拒否された場合、たいていはこれが原因で、このページのバイト数を見れば実際のサイズが分かります。
200文字のテキストが、255文字のデータベースのフィールドに入らなかったのはなぜですか?
そのフィールドはほぼ間違いなく、文字数ではなく「バイト数」を制限しているからです。UTF-8では、英語の普通のアルファベットは1文字1バイトですが、アクセント付きの文字は2バイト、中国語、日本語、アラビア語、絵文字は3〜4バイトを使います。つまり日本語200文字は600バイトになります。ここでバイト数を表示しているのはまさにそのためで、それがデータベースが実際にチェックしている数値です。
絵文字が1つあるだけで、SMSの上限が160文字から70文字に減るのはなぜですか?
SMSは160文字を収められるコンパクトな7ビット文字セットを使っていますが、この文字セットには絵文字もカーリークォートもなく、アクセント付きの文字もほとんどないからです。その範囲外の文字が1つでもあると、メッセージ「全体」がUnicodeに切り替わり、上限が70文字に下がります。Wordから貼り付けたカーリーアポストロフィでも、絵文字と同じように簡単にこれが起こります。短いメッセージが3通分として課金されるのはこのためで、このページはそうなった瞬間にお知らせします。
スペースも数えますか?
両方の数値を同時に表示するので、どちらかを選ぶ必要はありません。改行やタブも空白として数えます。
ご注意: 「文字」には4つの意味があり、どれが必要かは上限を設けている側によって変わるため、4つの数値を表示します。データベースのVARCHARはUTF-8のバイト数を、正規表現はコードポイントを、JavaScriptはUTF-16単位を、人は目に見えるものを数えます。最も食い違うのは絵文字です。
このツールをあなたのサイトに設置
ブログ、授業のページ、ヘルプ記事などに無料で設置できます。コードを1つ貼り付けるだけで、訪問者がそのページ上でツールを使えるようになります。