
Emoji Picker
Search and copy 1,800+ emoji. Browse by category, choose skin tone, and build emoji combos. Click any emoji to copy.
Last reviewed: May 2026New to this tool? Click here for instructions
What This Tool Does
The Emoji Picker is a searchable, categorized library of more than 1,800 Unicode emoji that runs entirely in your browser. Click any emoji to copy the glyph (and any attached skin-tone modifier) directly to the clipboard. Search by name or alias — typing fire filters to the flame emoji, face filters to the full smileys range, and flag us narrows down to the United States flag. Beyond the visible library, the tool exposes the underlying Unicode mechanics that most pickers hide: hover a glyph to see its keyword aliases, browse by Unicode-block category (Smileys & Emotion, People & Body, Animals & Nature, Food & Drink, Travel & Places, Activities, Objects, Symbols, Flags), and inspect recently-copied items in a persistent history backed by localStorage.
Five things distinguish this picker from a system emoji panel. First, every emoji is searchable by multiple keyword aliases drawn from the CLDR (Common Locale Data Repository) annotation set, so you can find a glyph even when you forget its exact name. Second, the picker exposes the Fitzpatrick skin-tone modifiers (U+1F3FB through U+1F3FF) as toggles that automatically attach to any base emoji from the People range that supports them. Third, the categorized layout mirrors the Unicode block organization, which makes it easy to scan by semantic group rather than alphabetically. Fourth, a curated Combos tab provides ready-to-paste emoji sequences for common use cases — birthday wishes, celebration runs, travel announcements. Fifth, nothing leaves your browser: the entire dataset is bundled with the page, your search queries are processed locally, and the recently-copied history lives in localStorage on your device only. No telemetry, no signup, no rate limits.
How to Use It
The interface is split into four modes via the chip row above the toolbar. The default Search mode shows every emoji and filters as you type. By Category displays a tab strip with each Unicode block name and a grid of emoji for the selected category. Recent shows the last twenty emoji you copied, persisted across browser sessions. Combos displays curated multi-emoji sequences for common messaging scenarios.
Searching by Name or Alias
Type any keyword into the search box at the top of the toolbar. The matcher searches the keyword string attached to every emoji entry, which includes the official Unicode name plus CLDR-derived aliases. For the fire emoji, the keyword string is fire flame burn hot lit, so any of those words will surface it. Aliases are lowercase and partial — burn matches burning only if the entry explicitly contains that token, but the search itself is substring-based, so burnt would not match burn. If a search returns zero results, try a shorter substring or a synonym; the keyword set is curated rather than exhaustive.
Browsing by Category
Click the By Category chip to expose a tab strip. The categories follow the Unicode Standard Annex #51 grouping: Smileys, People, Animals, Food, Travel, Objects, Symbols, and Flags. Each category corresponds to one or more Unicode blocks — for example, Smileys is U+1F600–U+1F64F (Emoticons block), Animals draws from U+1F400–U+1F4FF (Miscellaneous Symbols and Pictographs) plus newer additions in U+1F980–U+1F9FF (Supplemental Symbols and Pictographs).
Clicking to Copy
Click any emoji button in the grid. The glyph is written to your clipboard via the asynchronous navigator.clipboard.writeText() API. A toast confirmation pops up briefly, the button flashes with a pulse animation, and the emoji is added to the front of your Recently Copied list. Paste the emoji anywhere — Slack, Discord, GitHub issue, email, code editor, terminal — with Ctrl+V (or Cmd+V on macOS). Because the clipboard receives the literal Unicode characters, the receiving application uses its own emoji font to render them.
Applying Skin-Tone Modifiers
Select one of the six skin-tone swatches in the toolbar: default (no modifier), light, medium-light, medium, medium-dark, or dark. These map to Unicode codepoints U+1F3FB through U+1F3FF, the five Fitzpatrick Type-1-2 through Type-5-6 skin-tone modifiers introduced in Unicode 8.0 (2015). When a modifier is active, the tool appends the modifier codepoint to any base emoji that supports skin variation — primarily hand gestures and people from the U+1F466–U+1F487 range plus selected entries in U+1F574, U+1F645–U+1F647, and the U+1F9CD–U+1F9DF Neutral Person range. Emoji that do not support skin tones (smileys, animals, food, objects, flags) ignore the modifier and copy unchanged.
Worked Example: Finding the Fire Emoji and Using Its Codepoint
Type fire into the search box. The matcher filters the 1,800+ emoji set down to roughly half a dozen results — the flame, the fire engine, the fire extinguisher, the firefighter, and a few others. The top result is 🔥 FIRE, codepoint U+1F525, introduced in Unicode 6.0 (October 2010) in the original emoji unification that brought the SoftBank/Docomo/KDDI Japanese carrier emoji into the Unicode Standard.
Click the flame to copy 🔥. The glyph is now in your clipboard. The interesting part for developers is that the same codepoint has at least four different representations depending on where you are using it, and knowing the codepoint lets you use the right one in each context.
The Glyph (literal Unicode character)
In any text context where Unicode is supported — HTML body text, JavaScript source files, Slack messages, README files, commit subjects — you can paste the literal 🔥 character. The encoded bytes in UTF-8 are F0 9F 94 A5 (four bytes). In UTF-16 the glyph is the surrogate pair 0xD83D 0xDD25 (two 16-bit code units). Most modern tooling defaults to UTF-8, so the glyph travels safely through git, GitHub, JSON, and HTTP without escaping.
HTML Entities
If you cannot rely on the source file being saved as UTF-8 — or you want to be defensive against editors that mangle non-ASCII bytes — use the HTML numeric character reference. The decimal form is 🔥 and the hexadecimal form is 🔥. Both decode to the same flame glyph in any HTML5-conformant browser. There is no named HTML entity for the fire emoji; named entities cover only a small subset of legacy symbols.
CSS Content
In CSS content properties (typically on ::before and ::after pseudo-elements), the codepoint goes in as a hex-escaped sequence with no U+ prefix and no semicolon: content: "\1F525";. CSS requires a trailing space or a six-digit zero-padded form ("\01F525") when the next character could be a valid hex digit. The browser then renders the codepoint using whichever emoji font the rendering chain selects.
JavaScript String Construction
In JavaScript, String.fromCodePoint(0x1F525) returns the flame as a two-code-unit string. The codepoint-aware companion to charCodeAt is codePointAt: '🔥'.codePointAt(0).toString(16) returns '1f525'. Crucially, '🔥'.length is 2, not 1, because JavaScript strings are UTF-16 and the flame is a supplementary-plane codepoint. To iterate code points rather than UTF-16 code units, use [...'🔥'] or '🔥'.codePointAt(0) directly.
Source Code Identifiers and Filenames
Most languages permit emoji in string literals but not in identifier names. JavaScript and Python both reject emoji as variable names; Swift famously allows them. Filenames containing emoji work on macOS HFS+ and APFS, on Linux ext4, and on Windows NTFS, but the safety depends on the toolchain you pipe them through — git handles emoji filenames cleanly, but older shell scripts or CI runners with non-UTF-8 locales can mangle them.
Common Use Cases
Slack, Discord, and Microsoft Teams
Chat platforms accept literal emoji directly — paste the glyph and it renders inline. Slack and Discord additionally support shortcode syntax (:fire:, :thumbsup:) that they translate to emoji at render time. The advantage of shortcodes is that they survive plain-text logs even when the recipient's emoji font is missing; the disadvantage is that the shortcode dictionary is platform-specific and not interoperable. When in doubt, use the literal glyph: it is guaranteed to round-trip through plain text without any platform-specific translation layer.
GitHub READMEs and Commit Messages
GitHub renders emoji in README files, issue titles, pull-request descriptions, and commit messages. The Conventional Commits and Gitmoji conventions formalize this: :sparkles: for new features, :bug: for bug fixes, :fire: for removing code, :lock: for security fixes. GitHub's emoji rendering uses the open-source Twemoji set on web, which means the same commit message looks different in the GitHub web UI than in your terminal. For commit subjects, prefer either the literal glyph (renders everywhere) or a leading Gitmoji shortcode (rendered by GitHub web, plain text in terminals).
Marketing Copy, Email Subject Lines, and Push Notifications
A single well-placed emoji in an email subject line measurably increases open rates in marketing campaigns — the visual disrupts the all-text inbox and draws the eye. The standard caveats apply: test on the actual rendering target (Gmail web, iOS Mail, Outlook desktop) because subject-line emoji rendering is notoriously inconsistent. Push notifications on iOS and Android both render emoji in titles and bodies; ensure your notification payload is UTF-8 encoded and your backend's database column is UTF-8 (or utf8mb4 on MySQL).
Unicode-Aware Regular Expressions
Treating emoji as data — counting them in user input, stripping them for ASCII-only fields, or matching only emoji-bearing strings — requires Unicode-aware regex. In JavaScript the /u flag enables codepoint-level matching, and the \p{Emoji} Unicode property escape matches any emoji character. The newer /v flag (Node 20+, modern browsers) adds set notation and properly handles strings of any length, which matters for emoji ZWJ sequences. Our Regex Tester supports both flags and includes Unicode property escapes in its highlighting.
Accessibility: When Emoji Need aria-label
Screen readers announce emoji using their Unicode name. The flame becomes "fire", a thumbs-up becomes "thumbs up", the family emoji becomes "family". This works adequately for decorative emoji embedded in body text, but it can become noisy or misleading when emoji are used as functional UI elements — an icon-only button labeled with just 🔥 would be announced as "fire button" with no further context. The recommended pattern is to wrap functional emoji in an element with role="img" and an explicit aria-label describing the action: <span role="img" aria-label="Trending now">🔥</span>. For purely decorative emoji adjacent to descriptive text, use aria-hidden="true" so the screen reader does not announce it twice.
Edge Cases: Surrogate Pairs, Modifiers, ZWJ Sequences, and Platform Rendering
Emoji handling looks simple from the user's side — pick a glyph, paste it, done — but the underlying data model is layered enough that string-manipulation bugs are common when developers assume "one character = one codepoint = one byte". The four cases below are the ones that bite most often.
Surrogate Pairs in UTF-16
JavaScript and Java both use UTF-16 as their internal string encoding. UTF-16 represents Unicode codepoints from U+0000 to U+FFFF (the Basic Multilingual Plane) in a single 16-bit code unit, but codepoints above U+FFFF require a surrogate pair — two 16-bit code units, one in the high-surrogate range U+D800–U+DBFF and one in the low-surrogate range U+DC00–U+DFFF. Almost all emoji live above U+FFFF (in the Supplementary Multilingual Plane starting at U+10000), so almost every emoji is a surrogate pair. The grinning face 😀 is the UTF-16 pair 0xD83D 0xDE00. JavaScript's '😀'.length returns 2, not 1; '😀'.charCodeAt(0) returns 0xD83D, the lead surrogate. Use codePointAt instead of charCodeAt when you want the actual codepoint.
Skin-Tone Modifiers Are Separate Codepoints
The waving hand emoji with a medium skin tone, 👋🏽, is actually two codepoints: the base 👋 (U+1F44B WAVING HAND) followed by the modifier 🏽 (U+1F3FD EMOJI MODIFIER FITZPATRICK TYPE-4). The rendering font interprets the modifier as an instruction to draw the base glyph with the specified skin tone. Three properties follow from this: the string length is two codepoints (four UTF-16 code units), so iterating must use codepoint-aware methods; the modifier without a preceding base codepoint typically renders as a small color swatch; and not every emoji supports skin-tone modifiers — smiley faces, animals, and objects ignore the modifier and the renderer typically displays the modifier as a separate glyph next to the base.
ZWJ Sequences Glue Multiple Emoji Together
The most extreme example is the family emoji man-woman-girl, 👨👩👧, which is five codepoints: U+1F468 (MAN) + U+200D (ZWJ) + U+1F469 (WOMAN) + U+200D (ZWJ) + U+1F467 (GIRL). The Zero-Width Joiner U+200D tells the renderer "treat the preceding and following emoji as a combined glyph". If the font has artwork for this specific sequence, it renders as a single family picture. If the font does not recognize the sequence, it falls back to drawing the three faces side by side. Profession emoji follow the same pattern — woman-firefighter is WOMAN + ZWJ + FIRE ENGINE, rendered as a single composite glyph on supporting fonts.
Platform Rendering Differences
Unicode standardizes the codepoint and the name. It does not standardize the artwork. Apple ships Apple Color Emoji, Google ships Noto Color Emoji on Android, Microsoft ships Segoe UI Emoji on Windows, Samsung ships its own variant, and X (formerly Twitter) ships Twemoji (which GitHub also uses). The grinning face 😀 therefore looks subtly different on each platform — the colors, mouth shape, eye style, and overall geometry all vary. The differences are usually cosmetic, but a handful of historically controversial emoji have had real semantic divergence: the "pistol" emoji U+1F52B was a realistic revolver on most platforms until Apple unilaterally switched to a water pistol in iOS 10 (2016), and other vendors followed over the next two years. For interoperable design work, never assume the recipient sees what you see — check at minimum on iOS Safari, Chrome on Android, and Chrome on Windows.
Older Font Fallback and Tofu
When the rendering OS does not have a glyph for a given codepoint — common with newly-released Unicode emoji on devices that have not been updated — the renderer falls back to a tofu rectangle or a missing-glyph box. There is no way for the picker to know in advance whether the recipient's device will render a specific emoji; the only mitigation is to load a webfont like Noto Color Emoji as a CSS @font-face fallback, accepting the bandwidth cost (Noto Color Emoji is roughly 9 MB) in exchange for consistent rendering.
Behind the Scenes: Unicode Standard, UTR #51, and CLDR Annotations
The Unicode Standard and UTR #51
Emoji are governed by two documents from the Unicode Consortium. The Unicode Standard defines every codepoint, its name, its General Category, and its bidirectional class — this is what allocates U+1F525 to FIRE and U+1F600 to GRINNING FACE. Layered on top is Unicode Technical Report #51 (UTR #51), "Unicode Emoji", which specifies which codepoints are emoji, how they should be presented (emoji-style vs. text-style), how variation selectors work, how skin-tone modifiers attach, which ZWJ sequences are recommended for general interchange (the RGI — Recommended for General Interchange — emoji set), and what each new Unicode version adds.
How Emoji Ranges Are Defined
Emoji are not allocated to a single Unicode block; they are scattered across many. The largest concentration is in the supplementary planes: U+1F600–U+1F64F (Emoticons), U+1F300–U+1F5FF (Miscellaneous Symbols and Pictographs), U+1F680–U+1F6FF (Transport and Map Symbols), U+1F900–U+1F9FF (Supplemental Symbols and Pictographs), and U+1FA70–U+1FAFF (Symbols and Pictographs Extended-A, where newer emoji land). Legacy emoji also exist in the Basic Multilingual Plane — the watch ⌚ is at U+231A, the warning sign ⚠ is at U+26A0 — predating the supplementary-plane allocations.
CLDR Annotations and Aliases
The keyword strings this tool uses for search are derived from the Common Locale Data Repository (CLDR) emoji annotation set, which the Unicode Consortium maintains separately from the Standard itself. Every emoji has a short name (used by screen readers) and a list of keywords (used by emoji pickers for search). The CLDR data is translated into roughly 100 locales, so emoji search works in Spanish, Japanese, Hindi, and other languages just as well as it does in English. Apple, Google, and Microsoft all draw from the same CLDR annotations to power their system emoji pickers, which is why typing fire in any of them surfaces the flame.
The Unicode Consortium Proposal Process
New emoji enter the Standard through a formal proposal process. Anyone can submit a proposal to the Unicode Emoji Subcommittee, but the proposal must include expected usage frequency data, distinctiveness arguments, completeness considerations, image samples, and a discussion of why the proposed emoji is not already covered by existing codepoints or ZWJ sequences. The committee reviews proposals annually; approved emoji are added in the next yearly Unicode release. Unicode 16.0 (September 2024) added eight new emoji including the face with bags under eyes , the fingerprint 🬞, and the harp. Unicode 17.0 is scheduled for September 2026.
Comparison: Emoji Picker vs. Emojipedia, System Pickers, and unicode-table.com
Four common ways exist to find an emoji and copy it. Each has a specific niche where it is the right tool.
| Tool | Best For | Strengths | Limitations |
|---|---|---|---|
| ThisDevTool Emoji Picker | Developers needing alias search, skin-tone modifiers, recent history, and curated combos | Keyword search, persistent history, no signup, runs offline once cached, skin-tone toggle, no telemetry | Curated emoji set (1,800+); newest Unicode-16 emoji are added as platform fonts catch up |
| Emojipedia.org | Researching the meaning, history, and per-vendor artwork of a specific emoji | Authoritative per-vendor screenshots (Apple, Google, Microsoft, Samsung), historical revisions, named-version timeline | Heavier UI, ad-supported, slower for bulk copy |
| System emoji picker (Win+; on Windows, Cmd+Ctrl+Space on macOS, long-press on iOS/Android) | Quick paste from anywhere without leaving your current application | Native, always available, no network needed, recently-used list per OS | No alias search on some versions; categories follow OS conventions which may differ from Unicode blocks; cannot inspect codepoints |
| unicode-table.com | Looking up arbitrary Unicode codepoints, not just emoji — mathematical operators, Cyrillic, ancient scripts | Full Unicode coverage, codepoint-level navigation, UTF-8 / UTF-16 byte breakdowns | Generic Unicode browser; emoji UX is secondary; no curated aliases for emoji search |
If you are building a feature that needs an emoji programmatically — loading a specific glyph in code rather than picking it interactively — pair this tool with our Unicode Search for codepoint-level lookups and our Regex Tester for verifying that your Unicode-aware regex correctly matches the emoji you embed.
Frequently Asked Questions
Why does the same emoji look different on iPhone vs Android?
The Unicode Standard defines the codepoint and the name of each emoji, but it does not dictate the artwork. Each platform vendor ships its own emoji font: Apple uses Apple Color Emoji, Google uses Noto Color Emoji, Microsoft uses Segoe UI Emoji, Samsung and Facebook ship their own designs. The same codepoint U+1F600 (grinning face) is therefore rendered by Apple as one specific yellow smiley, by Google as a slightly different one, by Microsoft as a flatter design, and so on. Newer Unicode emoji that have not yet been added to an older device's font fall back to a tofu rectangle or the missing-glyph box.
What is a ZWJ sequence?
A Zero-Width Joiner (ZWJ, U+200D) sequence is a chain of two or more emoji codepoints joined by invisible ZWJ characters that the rendering font interprets as a single composite glyph. The family emoji man-woman-girl is the sequence U+1F468 U+200D U+1F469 U+200D U+1F467, which on a supporting font renders as one image of a family. Professions like woman-firefighter are person + ZWJ + fire engine. If the renderer does not recognize the sequence, it falls back to displaying each component emoji individually side by side.
How do I copy an emoji's Unicode codepoint?
Hover any emoji button in the picker; the title attribute reveals its keyword list, and the surrounding documentation lists the codepoint for the most common emoji. In code, you can get a codepoint programmatically: in JavaScript, '🔥'.codePointAt(0).toString(16) returns '1f525' for the fire emoji. The reverse direction is String.fromCodePoint(0x1F525), which produces the glyph. In CSS, content: "\1F525" inserts the emoji from its hex codepoint. In HTML you can use the decimal entity 🔥 or the hex entity 🔥 to embed the same glyph.
Why is the family emoji 👨👩👧 made of 5 characters in JavaScript?
JavaScript strings are UTF-16 encoded, and emoji above U+FFFF require a surrogate pair of two 16-bit code units. The family emoji man-woman-girl is the ZWJ sequence U+1F468 U+200D U+1F469 U+200D U+1F467. Each of the three faces is a surrogate pair (2 code units each = 6 code units total), plus the two ZWJ joiners (1 code unit each = 2 code units), for 8 UTF-16 code units. The string's .length returns 8, while spreading the string into an array yields 5 logical code points: [man, ZWJ, woman, ZWJ, girl]. To count perceived characters you need a grapheme cluster splitter such as Intl.Segmenter, which would return 1 for this whole sequence.
Can emojis cause SQL injection?
Emoji characters by themselves are not a SQL injection vector — they are just Unicode codepoints that get stored as bytes. However, two related risks exist. First, if your database column uses a charset that cannot represent supplementary-plane characters (MySQL's legacy utf8 is only 3-byte UTF-8 and rejects 4-byte sequences like most emoji), an insert can fail or truncate, and that error handling sometimes leaks data. Use utf8mb4 in MySQL or UTF-8 in Postgres. Second, like any user input, emoji-bearing strings must always be parameterized — never concatenated into a SQL string. The vector is the lack of parameterization, not the emoji itself.
Are emojis case-insensitive in regex?
Emoji codepoints do not have an upper/lower case distinction in the Unicode database, so the regex /i flag has no effect on them — they only match themselves. The real regex pitfalls with emoji are different: a plain character class like /[abc]/ does not work with a multi-codepoint emoji because JavaScript regex without the /u flag operates on UTF-16 code units, not codepoints. Always use the /u flag for emoji matching. To match any emoji you can use the Unicode property escape /\p{Emoji}/u (or /\p{Emoji_Presentation}/u for emoji that default to emoji-style rendering). For ZWJ sequences and modifier sequences, /\p{RGI_Emoji}/v (in Node 20+ and modern browsers with the /v flag) matches whole grapheme clusters.
Why won't the new Unicode 16 emojis render on older devices?
Emoji rendering depends on the emoji font shipped with the operating system, not on the browser. When Unicode releases a new version (Unicode 16.0 came in September 2024), the codepoints are reserved immediately, but Apple, Google, Microsoft, and Samsung have to design and ship the new glyphs in an OS update. A user on iOS 17 will not see the Unicode 16 emoji even on the latest Chrome — the OS-level font is the bottleneck. Until they update to the iOS version that includes Apple Color Emoji 17 (or equivalent), the new codepoint renders as tofu. Web fonts like Noto Color Emoji can be loaded as a fallback to render any emoji regardless of the OS font, at the cost of bandwidth and visual inconsistency.
What's the difference between an emoji shortcode and an HTML entity?
An emoji shortcode is an application-specific text alias such as :fire: or :thumbsup: that Slack, Discord, GitHub, and many static-site generators translate into the actual emoji glyph at render time. Shortcodes are not part of Unicode and only work inside platforms that implement the lookup table. The CLDR project ships a standardized set of short names (e.g. cldr-annotations) but the colon-wrapped shortcode form is a Slack/GitHub convention. An HTML entity such as 🔥 or 🔥 is a web-standard way to embed the literal Unicode codepoint in HTML source — the browser decodes it into the actual character before rendering. Shortcodes are a server- or client-side text-replace step; HTML entities are a transport encoding.