A character frequency map counts how often every distinct character appears in a piece of text and presents the result as a sorted table. It is a staple of classical cryptanalysis and a quick way to audit the makeup of any string.
How it works
The tool walks the text one code point at a time and tallies each character in a map, then sorts the results:
for each codePoint in text:
if ignoreWhitespace and char is whitespace: skip
if caseInsensitive: char = char.toLowerCase()
counts[char] += 1
sort rows by count desc, then by code point asc
Iterating by code point with a for...of loop means surrogate pairs such as
emoji are handled correctly. Whitespace characters are given readable labels so
their counts are visible.
Worked example: Mississippi
Paste Mississippi into the tool with case-insensitive mode on and whitespace ignored. The result looks like:
| Char | Count |
|---|---|
| i | 4 |
| s | 4 |
| m | 1 |
| p | 2 |
With the s and i tied at 4, the tie is broken by Unicode code point: i (U+0069) comes before s (U+0073), so i ranks first. Total characters: 11 letters, 0 spaces.
Use cases beyond cryptanalysis
Substitution cipher analysis. Paste the ciphertext, enable case-insensitive mode, ignore spaces. The most frequent ciphertext character is a strong candidate for e, the most common letter in English. Map the top five against the English frequency order (e, t, a, o, i, n, s, h, r) to get an initial key.
Data quality audits. Copy a CSV column or a database export and check for unexpected characters: stray tabs, non-breaking spaces (U+00A0, distinct from regular space), zero-width joiners, or right-to-left marks. These are invisible in a text editor but immediately visible in a frequency table because they appear with their Unicode label rather than a blank.
Encoding checks. If you are debugging a file that was supposed to be ASCII but shows unusual characters, a frequency table pinpoints which unexpected code points are present and how many times — much faster than scanning line-by-line.
Language detection heuristics. Different scripts have strongly characteristic characters. Arabic texts have high counts of ا (alef) and ل (lam); Spanish texts show ñ and accented vowels; Russian texts show Cyrillic code points. A quick frequency scan can confirm whether text decoded correctly after a charset conversion.
Minified code review. Checking minified JavaScript or CSS? A frequency map quickly shows whether curly braces, semicolons, and parentheses appear in roughly expected ratios — useful for spotting truncation or corruption.
Tips for getting the most out of the table
- Case-insensitive mode is essential for natural-language analysis; without it,
Eandeappear as separate entries and split a character’s true count. - Ignore whitespace removes space, tab, newline, and carriage-return from the table when you only care about letter or symbol distribution.
- Copy the table as tab-separated values and paste into a spreadsheet for further analysis, charting, or comparison against reference frequencies.