Your files never leave your device. All processing happens locally in your browser.
How do I find and copy an emoji, and get its Unicode code point?
Open a client-side emoji picker, type a word like “fire”, “laugh” or “rocket” (or browse the nine category tabs), then tap the emoji to copy it and paste it anywhere. Click an emoji to see it large with its Unicode code point (e.g. U+1F600) and every developer escape form — HTML entity, CSS, JavaScript and Python — each copyable. Supported people and hand emoji take a skin tone. Everything runs in your browser; nothing is uploaded.
Search by name or keyword across 350+ curated emoji, or browse 9 Unicode categories
One-tap copy with a toast, plus a recently- and frequently-used row saved locally
Skin-tone selector (Fitzpatrick U+1F3FB–U+1F3FF) for supported people & hand emoji
Per-emoji code points and HTML / CSS / JS / Python escape forms, all copyable
100% client-side — no emoji API, no CDN, nothing uploaded
What is
Emoji Picker
An emoji picker is a tool for finding, previewing and copying emoji — typically with category tabs, a keyword search, a skin-tone selector and a recently-used row. A developer-focused picker also exposes each emoji’s Unicode code point(s) and escape forms (HTML entity, CSS, JavaScript, Python). Because an emoji is a Unicode code point rather than an image, it is drawn by whichever emoji font the viewing device provides, so the same emoji looks different across Apple, Google, Microsoft and Samsung.
No. The emoji set ships inside the page, and searching, copying and code-point lookup all happen in your browser.
The emoji picker is 100% client-side. The whole curated emoji dataset is bundled into the page as plain text, so there is no emoji API, CDN or server call anywhere in the tool — search, copy and every code-point or escape-form calculation run on your device in JavaScript. Your recently- and frequently-used emoji are stored only in this browser’s localStorage and can be cleared at any time. The tool works offline once cached, and the only optional network use on the site is consent-gated ads, which never see your activity.
An emoji is a Unicode code point, not a picture, so each platform draws it with its own font — Apple, Google, Microsoft and Samsung all differ.
Unicode defines which emoji exist and what they mean, but leaves the artwork to each vendor. So 😂 is drawn by Apple’s font on an iPhone, Google’s Noto font on most Android phones, Segoe / Fluent on Windows and One UI on Samsung Galaxy devices — four different designs of the same code point. This picker renders with your device’s own emoji font, which is exactly how you will see it elsewhere, but your reader may see a different design. A brand-new emoji can even show as a box (□) on an older OS that has not shipped its font yet.
Pick a Fitzpatrick tone (light to dark, U+1F3FB–U+1F3FF); it attaches to supported people and hand emoji only.
Five Unicode skin-tone modifiers based on the Fitzpatrick scale (U+1F3FB light through U+1F3FF dark) change the colour of human and hand emoji. In this picker you choose a tone once and it is applied to every supported emoji — hands, gestures and single-person emoji. Non-human emoji and multi-person sequences are left unchanged. The exact shade still varies a little by platform, and the emoji’s code-point read-out updates to include the modifier so you can see the full sequence.
Click the emoji and copy its HTML entity (e.g. 😀), CSS escape, JavaScript (\u{1F600}) or Python form from the inspector.
Because an emoji is one or more Unicode code points, developers need it in different escape forms depending on where it goes. Click any emoji and the inspector shows its U+ code point(s) plus the HTML hex entity (😀), HTML decimal entity, the CSS content escape, the JavaScript ES6 form (\u{1F600}) and the ES5 surrogate-pair form (😀), and the Python escape — each with its own copy button, and all computed with the selected skin tone applied so multi-code-point sequences show every scalar.
Detailed Explanation
📖How It Works
What the Emoji Picker Does
The tool is a fast, private way to find, preview and copy emoji. A curated local dataset of 350+ emoji is grouped by the nine standard Unicode categories — Smileys & Emotion, People & Body, Animals & Nature, Food & Drink, Travel & Places, Activities, Objects, Symbols and Flags — and every entry carries keywords so a search for “fire”, “laugh”, “rocket” or “100” lands on the right glyph. Tapping an emoji copies it with a toast and adds it to a recently- and frequently-used row saved locally; a Multi mode batches several emoji into a basket you can copy at once. Clicking an emoji also opens an inspector showing it large with its name, category, Unicode code point(s) and every developer escape form.
350+ curated emoji across the 9 standard Unicode categories
Keyword search plus one-tap copy with a toast
Recently- and frequently-used rows persisted in localStorage
Multi-select basket to copy several emoji together
⚙️Methodology
How Skin Tones and Code Points Are Computed
A pure engine (emojiDataEngine.ts) does the work with no network. Skin tones use the five Fitzpatrick modifiers (U+1F3FB–U+1F3FF): for a supported people or hand emoji the engine drops any trailing variation selector (U+1F3FB replaces the U+FE0F emoji-presentation selector) and appends the chosen modifier, leaving non-human emoji untouched. Code points are extracted with surrogate-pair-aware iteration over the string, so a flag (two regional-indicator letters) or a skin-toned hand reports every scalar. From those code points the engine derives each escape form — U+ notation, the HTML hex and decimal entities, the CSS content escape, the JavaScript ES6 (\u{...}) form, the ES5 UTF-16 surrogate-pair form and the Python escape — and search ranks matches by exact name, name prefix, word-in-name and then keyword.
Fitzpatrick modifier appended after stripping U+FE0F, human emoji only
Surrogate-pair-aware code-point extraction handles flags and sequences
Escape forms derived per scalar for HTML, CSS, JS ES6/ES5 and Python
Ranked keyword search; all logic deterministic and client-side
🔧Technical Details
Emoji, Unicode and Escape Forms
An emoji is one or more Unicode code points, not an image. Simple emoji are a single scalar (grinning face is U+1F600); others are sequences — flags are two regional-indicator symbols, many emoji carry a U+FE0F variation selector to force emoji (vs text) presentation, and complex emoji join scalars with a zero-width joiner (U+200D). Above U+FFFF, JavaScript stores a character as a UTF-16 surrogate pair (U+1F600 is 😀), which is why the ES5 form differs from the ES6 \u{1F600} form. HTML accepts either the decimal (😀) or hex (😀) numeric entity, CSS uses a backslash-hex escape, and Python uses \U with eight hex digits for astral code points. The inspector shows all of these for the selected emoji with its skin tone applied.
Grinning face = U+1F600; flags = two regional-indicator scalars
HTML hex/decimal, CSS, JS ES6/ES5 and Python forms all provided
⚠️Limitations
Honest Limitations
Emoji render with the viewing device’s own emoji font, so the same code point is different artwork on Apple, Google (Noto), Microsoft (Segoe / Fluent) and Samsung (One UI); what you see here is your device’s rendering, and your reader may see another. A very new emoji can appear as a box (□) or missing-glyph on an older operating system that has not shipped its font. Skin-tone modifiers attach only to supported people and hand emoji, and the exact shade varies by vendor. This is a broad, curated set — not the full ~3,800-emoji Unicode catalogue — and emoji specifications change over time. Character counts elsewhere may treat a multi-code-point emoji as several characters. When exact rendering matters, verify on the real target device.
Artwork differs across Apple, Google, Microsoft and Samsung fonts
Brand-new emoji may show as □ on older systems
Skin tones apply to supported human/hand emoji only; shade varies
Curated subset, not the full Unicode set; specs change over time
🔒Privacy & Security
Private by Design
The entire emoji dataset is bundled into the page as plain text, so there is no emoji API, CDN or server call anywhere in the tool: search, copy and every code-point and escape-form calculation run on your device in JavaScript. The only thing stored is your recently- and frequently-used list, which lives in this browser’s localStorage and never leaves it — a Clear button wipes it instantly. There is no backend, database, account or telemetry, the tool works offline once cached, and closing the tab keeps nothing beyond that local list. The only optional network use anywhere on the site is consent-gated advertising, which never sees your searches or copies.
No emoji API, CDN, server, database or telemetry in the path
Everything computed on your device in JavaScript
Recent/frequent list stored only in localStorage; clearable
Works offline once cached; only optional network use is consent-gated ads
Escape forms for one emoji — grinning face (U+1F600) — and where each is used
Form
Example (grinning face)
Where it is used
Unicode notation
U+1F600
Documentation, Unicode charts
HTML hex entity
😀
HTML / XML markup
HTML decimal entity
😀
HTML / XML markup
CSS escape
\1F600
CSS content property
JavaScript ES6
\u{1F600}
Modern JS string literals
JavaScript ES5
😀
Legacy JS (UTF-16 surrogate pair)
Python
\U0001F600
Python string literals
Multi-code-point emoji (flags, skin-toned hands, ZWJ sequences) produce several scalars, and the tool shows every one with the selected skin tone applied. The rendered artwork still depends on the viewing device’s emoji font.