One family emoji, four different counts
A character limit is incomplete until it says what is counted. The family emoji below has 11 UTF-16 code units, 7 Unicode code points, 1 grapheme cluster and 25 UTF-8 bytes. These are four measurements of the same input, not competing answers to one defined question.
Download and reproduce
This page supplies 24 deliberately chosen inputs, their exact code-point sequences and four measurements. The data is useful for teaching and small regression tests. It is not a market survey, a benchmark of competing tools, or the full Unicode conformance test suite.
Download 24 fixtures (JSON)Download reproduction scriptChoose the unit before enforcing a limit
- UTF-16 code units: JavaScript string length reports storage units. Some code points occupy two units.
- Unicode code points: string iteration separates encoded code points; a combining mark is still its own code point.
- Grapheme clusters: segmentation groups sequences such as combining accents and supported emoji sequences. This is useful for many user-facing character limits, but it does not perfectly define every readerโs perception.
- UTF-8 bytes: useful when a receiving system imposes a UTF-8 byte limit. A grapheme count cannot substitute for a byte budget.
Use the receiving form or APIโs documented rule. Do not assume that a social platform, application form or database applies this pageโs grapheme rule. Spaces and invisible characters remain in these measurements.
The 24-fixture results
The table is rendered in the page HTML and can be read without running JavaScript. Code-point labels make invisible and visually similar inputs distinguishable.
| Fixture | Input / code points | UTF-16 | Points | Graphemes | UTF-8 bytes |
|---|---|---|---|---|---|
| Empty stringempty | (empty)โ | 0 | 0 | 0 | 0 |
| ASCII wordascii | HelloU+0048 U+0065 U+006C U+006C U+006F | 5 | 5 | 5 | 5 |
| ASCII with spaceascii-space | A BU+0041 U+0020 U+0042 | 3 | 3 | 3 | 3 |
| Hangul composedhangul-nfc | ํ๊ธU+D55C U+AE00 | 2 | 2 | 2 | 6 |
| Hangul decomposedhangul-nfd | แแ
กแซแแ
ณแฏU+1112 U+1161 U+11AB U+1100 U+1173 U+11AF | 6 | 6 | 2 | 18 |
| One Hangul syllablehangul-syllable | ๊ฐU+AC01 | 1 | 1 | 1 | 3 |
| Conjoining Hangul jamohangul-jamo | แแ
กแจU+1100 U+1161 U+11A8 | 3 | 3 | 1 | 9 |
| Compatibility jamocompat-jamo | ใฑใ
ใฑU+3131 U+314F U+3131 | 3 | 3 | 3 | 9 |
| Composed accentaccent-nfc | รฉU+00E9 | 1 | 1 | 1 | 2 |
| Decomposed accentaccent-nfd | eฬU+0065 U+0301 | 2 | 2 | 1 | 3 |
| Two combining markstwo-marks | aฬฬฃU+0061 U+0301 U+0323 | 3 | 3 | 1 | 5 |
| Single emojiemoji | ๐U+1F600 | 2 | 1 | 1 | 4 |
| Emoji with skin toneskin-tone | ๐๐ฝU+1F44D U+1F3FD | 4 | 2 | 1 | 8 |
| Regional-indicator flagflag | ๐ฐ๐ทU+1F1F0 U+1F1F7 | 4 | 2 | 1 | 8 |
| Family ZWJ sequencefamily | ๐จโ๐ฉโ๐งโ๐ฆU+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466 | 11 | 7 | 1 | 25 |
| Profession ZWJ sequenceprofession | ๐ฉโ๐ปU+1F469 U+200D U+1F4BB | 5 | 3 | 1 | 11 |
| Heart without variation selectorheart-text | โคU+2764 | 1 | 1 | 1 | 3 |
| Heart with variation selectorheart-emoji | โค๏ธU+2764 U+FE0F | 2 | 2 | 1 | 6 |
| Keycap sequencekeycap | 1๏ธโฃU+0031 U+FE0F U+20E3 | 3 | 3 | 1 | 7 |
| CJK textcjk | ไธญๆU+4E2D U+6587 | 2 | 2 | 2 | 6 |
| Supplementary CJK charactersupplementary-cjk | ๐ ฎทU+20BB7 | 2 | 1 | 1 | 4 |
| Non-breaking spacenbsp | Aย BU+0041 U+00A0 U+0042 | 3 | 3 | 3 | 4 |
| Zero-width spacezero-width-space | AโBU+0041 U+200B U+0042 | 3 | 3 | 3 | 5 |
| Mixed Hangul, space and emojimixed | ํ๊ธ ๐U+D55C U+AE00 U+0020 U+1F600 | 5 | 4 | 4 | 11 |
Why Korean text is a useful test
In this fixture set, composed ํ๊ธ and its decomposed conjoining-jamo form both contain 2 grapheme clusters. Their UTF-8 sizes are 6 and 18 bytes. Compatibility jamo ใฑใ
ใฑ is a separate fixture: it produces 3 clusters here, while conjoining แแ
กแจ produces 1. Visually related input is not necessarily represented by the same sequence.
Normalization changes representation. Decide whether the application should normalize before comparing or storing text; do not silently normalize identifiers or signed payloads merely to obtain a preferred count. The measurements above preserve each supplied input.
Run a single example
const s = "๐จโ๐ฉโ๐งโ๐ฆ";
console.log({
utf16Units: s.length,
codePoints: Array.from(s).length,
graphemes: Array.from(new Intl.Segmenter("en", {
granularity: "grapheme"
}).segment(s)).length,
utf8Bytes: new TextEncoder().encode(s).length
}); // { utf16Units: 11, codePoints: 7, graphemes: 1, utf8Bytes: 25 }To run the full set, download the JSON and script into the same folder and run node unicode-character-count-reproduce.mjs. The script checks the four measurements against the stored expected values and reports the runtime.
Check your own text locally
This demonstration computes in your browser and sends no text. It contains no analytics or external script. This statement describes this standalone page, not every feature on the Chatcument domain.
How this relates to Chatcument
The Chatcument character counter uses grapheme segmentation when Intl.Segmenter is available and shows UTF-8 bytes separately. Its fallback counts code points, so older runtimes can differ for combined sequences. This report is published by Chatcument; it is not an independent review of the service.
ํ๊ตญ์ด ์์ฝ: ๊ธ์ ์์ ๋ฐ์ดํธ ์๋ ๋ค๋ฅธ ๊ธฐ์ค์ ๋๋ค
๊ฐ์กฑ ์ด๋ชจ์ง ํ ๊ฐ๋ ์ด ์๋ฃ์ ์คํ ํ๊ฒฝ์์ ๊ธ์ ๋ฌถ์ 1๊ฐ, ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ 7๊ฐ, UTF-16 ๋จ์ 11๊ฐ, UTF-8 ๋ฐ์ดํธ 25๊ฐ์ ๋๋ค. ์์ฑํ ํ๊ธ๊ณผ ๋ถํด๋ ์๋ชจ๋ ๋ณด์ด๋ ๋ชจ์์ด ๋น์ทํด๋ ๋ฐ์ดํธ ์๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ ๋ ฅ์ ๋ฐ๋ ์๋น์ค๊ฐ ๊ณต๋ฐฑยท์ค๋ฐ๊ฟยท์ด๋ชจ์ง๋ฅผ ์ด๋ป๊ฒ ์ธ๋์ง ๋จผ์ ํ์ธํ์ธ์. ํ๊ตญ์ด ๊ธ์ ์ ๋๊ตฌ์ ์ด ํ๋ฅผ ์ด์ฉํด ์์ ์ ๋ ฅ๋ถํฐ ์ฌํํ ์ ์์ต๋๋ค.
Method, limits and reuse
Generated on September 8, 2026 with Node v24.15.0, ICU 78.2, Unicode 17.0 and locale en. Each expected tuple was explicitly specified and checked by the generation script. The suite excludes malformed lone surrogates, line-ending conversion, script-specific tailoring and many newer or complex sequences. Font rendering does not change the encoded input; runtime segmentation data can affect results. Use the Unicode conformance data for standards testing.
The original fixture data and reproduction script are released under CC0 1.0. Reuse them without a required backlink. For readers who want a citation: Chatcument (2026), One family emoji, four different counts: 24 Unicode fixtures, this page.
Primary references
- Unicode Standard Annex #29, revision 47 โ segmentation definitions and conformance.
- MDN: String length โ JavaScript UTF-16 length.
- MDN: String normalize โ normalization forms.