Generate random characters from a chosen Unicode block β Latin, Greek, Cyrillic, CJK, arrows, mathematical operators, box drawing or emoji. Each result is shown with its code point, which makes it useful for testing encoding, fonts and text handling.
Settings
Recent results
Generated locally in your browser β your settings and results never leave this page.
Unicode as one shared numbering
Before Unicode, every script and region had its own character encoding, and text was only readable if the reader used the same one as the writer. The same byte meant different characters in different encodings, which is why documents once arrived as unreadable sequences of accented letters.
Unicode replaced that with a single numbering covering every script it has encoded. Each character gets a code point β a number, conventionally written as U+ followed by hexadecimal. The space extends to just over a million positions, of which around 150,000 are currently assigned.
Code points and encodings are different things
The most useful distinction to hold onto: a code point is a number, and an encoding is how that number becomes bytes.
UTF-8 is variable-width. ASCII characters take one byte, which is why UTF-8 is backward compatible with plain English text. Most European scripts take two, most CJK take three, and emoji and other supplementary characters take four. UTF-16, used internally by JavaScript and Java, uses two bytes for most characters and a pair of two-byte units for the rest.
The consequence is that “how long is this string” has several correct answers. Bytes, code points and visible characters can all differ, and a database column limited to 100 bytes will not hold 100 CJK characters. Truncating by bytes without checking boundaries produces invalid sequences.
Why emoji break things
Emoji live beyond U+FFFF, outside the Basic Multilingual Plane. In UTF-16 they are stored as a surrogate pair β two code units representing one character. Any code that treats one code unit as one character mishandles them.
The symptoms are familiar. A string length reports two for a single emoji. Truncating at a fixed length splits a surrogate pair and produces a replacement character. Reversing a string reverses the surrogates and corrupts every emoji in it. These are not exotic failures; they appear in production whenever someone puts an emoji in a display name.
Generating from the emoji block is therefore one of the fastest ways to find out whether text handling is correct. If a field survives a name made of emoji, it will probably survive most real input.
Combining characters and what counts as one character
An accented letter can be represented two ways: as a single precomposed code point, or as a base letter followed by a combining mark. Both display identically. They are different sequences, so a naive comparison says two visually identical strings differ β which is why normalisation exists, converting text to a canonical form before comparing.
Combining marks also mean that what a reader perceives as one character may be several code points. Correct cursor movement, selection and truncation work in grapheme clusters, not code points. Most languages need a library for this; few programs get it right by accident.
Unassigned positions
Blocks reserve space for future additions, so a uniform draw across a block’s range can produce an unassigned code point. These are legal to store and transmit and have no glyph anywhere, so they always render as a placeholder. That is not a bug in the tool, and it is worth knowing when a generated character shows as a box in every font you try.
Privacy
Characters are generated in your browser. Nothing is transmitted, stored or logged.
How to use the Random Unicode Character Generator
- Choose a Unicode block β Latin, Greek, Cyrillic, CJK, arrows, mathematical operators, box drawing or emoji.
- Set how many characters you want.
- Generate β each character is shown with its code point.
- Copy the characters alone, the table with code points, or export as CSV.
Frequently asked questions
What is a code point?
The number Unicode assigns to a character, written as U+ followed by hexadecimal digits. U+0041 is capital A. The code point is the character's identity; how it is stored in bytes depends on the encoding.
Why do some characters show as boxes?
Because your font has no glyph for them. The character is present and correct in the data β it will copy and paste intact β but the font cannot draw it, so the system shows a placeholder. Blocks like CJK and emoji are large, and no single font covers all of Unicode.
What is the difference between a code point and a byte?
A code point is a number; an encoding decides how to store it. UTF-8 uses one byte for ASCII, two for most European scripts, three for most CJK and four for emoji. This is why counting bytes and counting characters give different answers, and why truncating a string by bytes can cut a character in half.
Are all the characters in a block assigned?
No. Unicode blocks contain gaps reserved for future use, so a random draw from a block's range can land on an unassigned code point. Those are valid to store and transmit but have no glyph anywhere and will always show as a placeholder.
Why is emoji useful for testing?
Because emoji sit outside the Basic Multilingual Plane and need four bytes in UTF-8, or a surrogate pair in UTF-16. Code that assumes one character is one code unit breaks on them β string lengths come out wrong, truncation splits characters, and reversing a string corrupts it. They are an excellent stress test.
What are combining characters?
Marks that attach to a preceding character, such as an accent applied to a letter. They mean that what a reader sees as one character can be several code points, which is why counting "characters" is genuinely ambiguous and why some text processing needs to work in grapheme clusters rather than code points.
Can I use these in a password?
It is a bad idea. Non-ASCII characters in passwords cause problems with keyboard layouts, normalisation differences between systems, and login screens that reject them. The password generator here sticks to ASCII for that reason.