【無料】文字数・単語数カウンター
記事、キャプション、ブリーフ、多言語の下書きで信頼できる文字数・単語数が必要ですか。このツールは単語、文字、空白を除く文字、文、段落、推定読了時間を、決定的な一回の走査で測ります。同じ規則がブラウザの無料版とAPIの両方で動くため、自動化の結果がページ上のプレビューからずれません。
無料で実行
単語として数えるもの
単語は空白だけで分割するのではなく、Unicodeの文字と数字の並びから形成されます。don't のような短縮形や well-known のようなハイフン結合、3.14 のような小数はそれぞれ1語です。アンダースコアやメールの区切りはトークンを接合しません。foo_bar は2語、email@example.com は3語になります。空文字や空白のみは0語で、前後の空白が余分な語を作りません。アルゴリズムはUnicodeスカラーを辿るため、絵文字はUTF-16の2単位ではなく1文字として数えます。
辞書なしで扱う中国語・日本語・韓国語
空白で語を分けない書記体系には明示的な規則が必要です。漢字(Han)は1文字を1語とし、連続する仮名やハングルは連続区間を1語とします。Hello の直後に漢字が続くような混在文字列は、1つの塊に潰さずラテンと漢字のトークンに分けます。全角や表意の句点・感嘆符・疑問符も、次に空白がなくても文末として扱います。重い語彙セグメンタは載せません。規則は移植可能で監査しやすく、サーバーとブラウザで同一です。
文・段落と読了時間
文は ., !, ?, 三点リーダー、およびCJKの終端記号で終わり、閉じ引用符や括弧を任意で続けられます。3.14 の小数点は新しい文を開きません。段落は空行で区切られた非空行の塊です。塊の中の単なる改行は1段落のままです。読了時間は1分あたりの単語数(既定200)を使い、秒単位で切り上げます。語がなければ0です。編集画面、SEO検査、CMS検証、安定したカウントが必要なパイプラインではJSONフィールドをそのまま利用できます。
活用例
編集・SEOの長さ確認
公開前にタイトル、メタ説明、本文を測り、著者間で長さの目標を揃えます。
多言語の下書き
ラテンとCJKが混在する文を、表意文字を無視したり巨大な1語にしたりせず、明示規則で数えます。
自動化とCMS連携
無料ウィジェットと同じ契約でAPIを呼び、空投稿の拒否や読了時間の推定をパイプラインに組み込みます。
構造のプレビュー
下書きの横に文字数・文数・読了時間を出し、粗さだけの長さではなく構造を確認します。
よくある質問
オンラインの単語カウンターは無料ですか?
はい。ブラウザ版は端末内で無料です。APIは公開の基本料金 $0.002 を前払い残高から差し引きます。失敗したタスクは課金されません。
単語はどのように数えますか?
Unicodeの文字・数字の連なりに、アポストロフィ、ハイフン、小数点の明示的な結合を加えた規則です。Intl.Segmenter は使わないため、ブラウザとサーバーの結果が揃います。
中国語や日本語の数え方は?
漢字は1文字1語。連続する仮名・ハングルは連なりごとに1語です。「!」などの終端は、次が空白でなくても文を閉じます。
3.14 は2文になりますか?
いいえ。数字に挟まれた1つの小数点は、単語でも文でも数の内部に残ります。
reading_time_seconds とは?
ceil(語数 × 60 / wpm) です。既定の wpm は200。0より大きい有限数を指定して見積もりを変えられます。
テキストの上限は?
1リクエストあたり最大50万Unicode文字です。それ以上は分割してから数えてください。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/text/word-count \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello world. How many words is this?"}'const res = await fetch("https://api.kit.forhosting.com/text/word-count", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello world. How many words is this?"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/word-count",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello world. How many words is this?"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/word-count", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello world. How many words is this?"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello world. How many words is this?"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/word-count", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "Hello world. How many words is this?"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.word_count",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_chars | 500000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |