Kaomoji Picker – Browse, Copy and Measure Text Emoticons
A kaomoji is a face built out of ordinary text characters and read the right way up, which is what separates it from a Western emoticon like :-) and from an emoji. The word is Japanese for “face character”, and the family runs from the three-character -_- to elaborate scenes such as (╯°□°)╯︵ ┻━┻. This kaomoji picker is a browsable library of 230 of them with one-click copy, a character-cost readout and a neutral preview of how one sits inside a line of text.
Why kaomoji survive where emoji do not
Because a kaomoji is plain Unicode text, it goes wherever text goes: a comment box, a commit message, a profile bio, a filename, a terminal. Nothing has to support an image format. That same property is what makes kaomoji fragile in a way emoji are not — they are assembled out of brackets, katakana, combining marks and box-drawing characters that were never designed to appear together, so four things routinely break them.
The four ways a kaomoji breaks
Normalisation. Running text through Unicode NFKC rewrites halfwidth katakana (ノ becomes ノ) and collapses fullwidth brackets (( becomes (), which quietly redraws the face. This tool never normalises a glyph; the only thing it folds is the search key it builds from the name and tags.
Markdown. A Markdown renderer eats backslashes and turns paired underscores into italics, so ¯\_(ツ)_/¯ pasted raw commonly arrives with one arm missing. The Markdown-safe copy variant escapes the punctuation that a renderer would otherwise consume, and shows you the escaped string so you can see exactly what changed.
Fonts. A character renders only if the device has a font containing it. Kaomoji borrow from Japanese, Korean, Thai, Canadian Aboriginal syllabics and several symbol blocks, and no device carries all of them, so boxes are a font-coverage fact rather than a bug — on your machine or on whatever you paste into.
Counting. The same string has three legitimate lengths, and the tool reports all three separately.
Graphemes, code points and UTF-16 units
A grapheme is what a reader perceives as one character. A code point is one Unicode scalar value. A UTF-16 code unit is what String.lengthcounts in JavaScript. A combining mark adds a code point without adding a grapheme; a character outside the basic multilingual plane costs two UTF-16 units; a zero-width joiner and a variation selector are invisible and still cost. Grapheme segmentation here uses Intl.Segmenter with the locale pinned, so the same kaomoji measures the same on every machine, and the tool falls back to code-point counting — clearly labelled as approximate — on engines that lack it.
What the tool deliberately does not do
It reports the cost of the kaomoji you selected and nothing else. It does not accept free-form text for analysis, does not assert any platform’s character limit, and makes no claim about how a kaomoji performs anywhere. The composer preview is a plain unbranded box shown at several sizes, including a monospace line, because many kaomoji were drawn for fixed-width contexts and shift noticeably outside them. It shows how the characters sit against surrounding text on your device — it cannot predict another platform’s rendering.
Favourites, recents and privacy
Starred entries and recently copied ones are kept in your browser’s local storage as entry identifiers, never as glyphs, and every read is validated against the library before anything is shown. Nothing is uploaded, no analytics call carries your search term, and the tool works end to end with storage blocked — it simply forgets between visits.