ChatcumentResearch notes ยท Text processing

One family emoji, four different counts

Chatcument ยท September 8, 2026 ยท Original reproducible fixture study

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.

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ
11UTF-16 units
7Code points
1Grapheme cluster
25UTF-8 bytes

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 script

Choose the unit before enforcing a limit

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.

Measurements without implicit normalization
FixtureInput / code pointsUTF-16PointsGraphemesUTF-8 bytes
Empty stringempty(empty)โ€”0000
ASCII wordasciiHelloU+0048 U+0065 U+006C U+006C U+006F5555
ASCII with spaceascii-spaceA BU+0041 U+0020 U+00423333
Hangul composedhangul-nfcํ•œ๊ธ€U+D55C U+AE002226
Hangul decomposedhangul-nfdแ„’แ…กแ†ซแ„€แ…ณแ†ฏU+1112 U+1161 U+11AB U+1100 U+1173 U+11AF66218
One Hangul syllablehangul-syllable๊ฐU+AC011113
Conjoining Hangul jamohangul-jamoแ„€แ…กแ†จU+1100 U+1161 U+11A83319
Compatibility jamocompat-jamoใ„ฑใ…ใ„ฑU+3131 U+314F U+31313339
Composed accentaccent-nfcรฉU+00E91112
Decomposed accentaccent-nfdeฬU+0065 U+03012213
Two combining markstwo-marksaฬฬฃU+0061 U+0301 U+03233315
Single emojiemoji๐Ÿ˜€U+1F6002114
Emoji with skin toneskin-tone๐Ÿ‘๐ŸฝU+1F44D U+1F3FD4218
Regional-indicator flagflag๐Ÿ‡ฐ๐Ÿ‡ทU+1F1F0 U+1F1F74218
Family ZWJ sequencefamily๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆU+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466117125
Profession ZWJ sequenceprofession๐Ÿ‘ฉโ€๐Ÿ’ปU+1F469 U+200D U+1F4BB53111
Heart without variation selectorheart-textโคU+27641113
Heart with variation selectorheart-emojiโค๏ธU+2764 U+FE0F2216
Keycap sequencekeycap1๏ธโƒฃU+0031 U+FE0F U+20E33317
CJK textcjkไธญๆ–‡U+4E2D U+65872226
Supplementary CJK charactersupplementary-cjk๐ ฎทU+20BB72114
Non-breaking spacenbspAย BU+0041 U+00A0 U+00423334
Zero-width spacezero-width-spaceAโ€‹BU+0041 U+200B U+00423335
Mixed Hangul, space and emojimixedํ•œ๊ธ€ ๐Ÿ˜€U+D55C U+AE00 U+0020 U+1F60054411

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

Press Measure text to compare four units.

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