Count characters with and without spaces

See character counts with and without whitespace as you type, plus word groups, lines and UTF-8 bytes. Set your own character limit to see how many remain or exceed it.

Type text to see live counts

Processed in your browser · saves drafts when allowed Ready

Counted text

Count text and check a limit

01

Enter text

Type or paste into Text to count. All five totals update as you edit; there is no process button to press.

What do the five totals mean?

MetricHow this page countsWhen to use it
CharactersEach Unicode code point, including spaces, tabs and line breaks.The destination includes whitespace or you set a character limit.
No whitespaceRemoves spaces, tabs, line breaks and other whitespace before counting.The requirement excludes whitespace from the character total.
Word groupsEach run of non-whitespace text is one group; this is not linguistic word segmentation.A quick draft estimate; it may differ from a word processor.
LinesCounts line breaks in the text, including blank lines; visual wrapping does not add lines.Checking a list or text with deliberate line breaks.
UTF-8 bytesThe UTF-8 encoded text size, not the character total and not including the downloaded TXT file’s header bytes.A data field has a byte-based limit.

Why might another service show a different count?

Emoji and combining marks
This page counts Unicode code points. A joined emoji or a letter entered with a separate combining mark can look like one character but count as several code points. Check the final form when you are close to its limit.
Character limits
Your limit applies to Characters including whitespace, not Word groups or UTF-8 bytes. The tool does not know the counting rules of the social platform, form or content system you plan to use.
Line breaks and TXT bytes
Blank lines and line breaks increase Characters but not No whitespace. A downloaded TXT file can be larger than the UTF-8 bytes total because it includes a UTF-8 marker to help open accented text.

Is the text sent anywhere?

Counting runs in your browser; the text is not sent to an KitoTool counting API. When local storage is available, the page saves your draft and limit for a later visit. On a shared device, select Clear when finished. Copy result and Download TXT keep your text intact; they do not shorten it to the limit.

Comments & feedback

Rate this tool

Loading ratings…

Write a commentNo account needed

Do not share passwords, sensitive information or the contents of files you are processing.

Reviewed before posting. Email stays private.

Embed this tool on your websiteFree · Copy once, receive tool updates automatically

Paste the iframe into HTML, WordPress or any platform that supports embeds. The tool runs in the visitor’s browser; adjust its height and theme as needed.

View the embed guide and supported platforms →

<div style="max-width:900px">
  <iframe data-kitotool-embed src="https://kitotool.com/embed/en/character-counter/" title="Character Counter — KitoTool" width="100%" height="820" style="display:block;width:100%;border:1px solid #dbe3ee;border-radius:12px" loading="lazy" referrerpolicy="strict-origin-when-cross-origin"></iframe>
  <p style="margin:6px 2px 0;text-align:right;font:12px/1.5 system-ui,sans-serif;color:#64748b">Free tool by <a href="https://kitotool.com/en/character-counter/" target="_blank" rel="nofollow noopener noreferrer" style="color:#2359d4;text-decoration:underline">KitoTool</a></p>
</div>

The code includes a visible credit below the iframe; its link uses nofollow for a widely distributed widget.

Optional: automatically resize the iframe

Add this script once to the page containing the iframe.

<script>
(function(){var origin="https://kitotool.com";function frames(){return document.querySelectorAll("iframe[data-kitotool-embed]")}function measure(f){if(f.contentWindow&&new URL(f.src).origin===origin)f.contentWindow.postMessage({type:"kitotool:measure"},origin)}window.addEventListener("message",function(e){if(e.origin!==origin||!e.data||e.data.type!=="kitotool:resize"||!Number.isFinite(e.data.height))return;frames().forEach(function(f){if(f.contentWindow===e.source&&new URL(f.src).origin===origin)f.style.height=Math.max(320,Math.min(12000,Math.ceil(e.data.height)))+"px";});});function connect(){frames().forEach(function(f){f.addEventListener("load",function(){measure(f)});measure(f)})}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",connect,{once:true});else connect()})();
</script>