User Rating 0.0
Total Usage 0 times
1–50 faces
( ͡° ͜ʖ ͡°) Click Generate to create faces
Is this tool helpful?

Your feedback helps us improve.

About

Unicode text faces (commonly called Lenny faces or kaomoji) are constructed by combining characters from multiple Unicode blocks: fullwidth forms (U+FF00 - FF60), CJK symbols, combining diacritical marks, and miscellaneous technical characters. A single face follows the structural pattern F = La + Le + El + M + Er + Re + Ra, where each variable maps to a character pool. The total combinatorial space exceeds 500,000 unique permutations from the included component library. Incorrect character pairing can produce broken rendering on certain platforms - Windows, macOS, iOS, and Android each support different Unicode ranges. This generator only uses characters verified across major operating systems.

Manual face construction is error-prone: a misplaced combining character shifts the entire face, and some mouth characters have zero-width properties that collapse adjacent components. The generator handles directionality (LTR vs RTL characters), avoids known combining-mark conflicts, and validates structural balance so left and right delimiters always match. Faces are grouped by mood category for targeted use in messaging, forums, or social media bios.

lenny face kaomoji text emoticon unicode faces random generator copy paste faces emoticon generator

Formulas

Each Lenny face is assembled from a structural template with 7 positional slots. The total number of unique faces N for a given mood category is computed as:

N = |La| × |Le| × |E| × |M| × |E| × |Re| × |Ra|

Where La = left arm pool, Le = left ear/bracket, E = eyes pool (shared for symmetry), M = mouth pool, Re = right ear/bracket, Ra = right arm pool. For asymmetric faces the left eye El and right eye Er are drawn independently, squaring the eye contribution.

Random selection uses the Fisher-Yates algorithm to guarantee uniform distribution with time complexity O(n). Deduplication is enforced via string hashing into a Set structure, ensuring no repeated faces in a single batch even when the requested count k approaches the pool size. If k N, the generator caps output at N and notifies the user.

Reference Data

CategoryExample FaceMood / UseKey Unicode BlocksComponent Count
Classic( ͡° ͜ʖ ͡°)Suggestive / PlayfulCombining Diacriticals12
Happy(◕‿◕)Joy / GreetingGeometric Shapes18
Sad(╥﹏╥)Crying / SympathyBox Drawing, CJK14
Angry(╬ Ò﹏Ó)Frustration / RageLatin Extended11
Confused(⊙_⊙)?Surprise / DisbeliefMisc Technical10
Shrug¯\_(ツ)_/¯IndifferenceKatakana, Latin6
Love(♥‿♥)Affection / AdorationMisc Symbols13
Cool(⌐■_■)Confident / ChillGeometric, Misc9
Scared(ノಠ益ಠ)ノFear / PanicKannada, CJK10
Bear/Animalʕ•ᴥ•ʔCute / KawaiiPhonetic Extensions8
Table Flip(╯°□°)╯︵ ┻━┻Extreme AngerBox Drawing, CJK7
Magic(ノ◕ヮ◕)ノ*:・゚✧Excitement / SparkleKatakana, Dingbats15
Disapprovalಠ_ಠJudgment / StareKannada5
Musical♪(´ε` )Singing / WhistlingMisc Symbols, Latin9
Fighting(ง'̀-'́)งCombat / ChallengeThai, Combining8

Frequently Asked Questions

Each operating system bundles a specific set of Unicode fonts. Characters from blocks like Kannada (ಠ), Thai combining marks, or CJK compatibility forms require font coverage that older Android versions or Windows 7 systems may lack. This generator restricts its component pool to characters supported across iOS 14+, Android 10+, Windows 10+, and macOS 10.15+. If you still see broken rendering, your device's default font is missing glyphs from the Miscellaneous Technical (U+2300-23FF) or Geometric Shapes (U+25A0-25FF) blocks.
Each assembled face string is inserted into a JavaScript Set before being added to the output array. Sets enforce uniqueness via internal hashing - insertion of a duplicate is a no-op with O(1) average time complexity. If the requested batch size exceeds the combinatorial ceiling for the selected mood category, the generator clamps output to the maximum unique count and displays a notification.
Yes. Combining marks attach to the preceding base character and can stack vertically, causing line-height overflow in applications with fixed line spacing (e.g., Slack, Discord with compact mode). This generator limits combining mark depth to a maximum of 2 stacked marks per base character and avoids marks known to cause excessive vertical displacement, such as U+0363-036F (combining Latin small letters).
Mood is determined by the mouth and eye component pairing. Upward-curved mouths (‿, ◡, ᴗ) combined with round eyes (◕, ◉) map to "Happy". Downward mouths (︵, ﹏) with teardrop eyes (╥, ;) map to "Sad". The mapping follows a lookup table with 10 mood categories. Some components are shared across categories - for example, neutral eyes (°, ·) appear in both "Classic" and "Confused" depending on mouth context.
Characters from RTL scripts (Arabic, Hebrew) carry inherent directionality per the Unicode Bidirectional Algorithm (UAX #9). If an RTL character is placed mid-face without an explicit LTR override (U+200E), the rendering engine may reorder adjacent characters. This generator wraps all output faces in LTR isolation to prevent reordering. However, some messaging platforms strip directional control characters - in that case, avoid RTL-containing faces for those platforms.
With the current component library of approximately 25 eye pairs, 30 mouths, 15 ear/bracket pairs, and 20 arm variants, the theoretical maximum is 25 × 30 × 15 × 20 = 225,000 unique symmetric faces. Asymmetric mode (independent left/right eyes) raises this to over 5,600,000. Not all combinations produce aesthetically coherent faces, so the curated mood-filtered pools reduce this to roughly 10,000 - 50,000 visually balanced faces per category.