Free QR Code Character Encoding Checker
A QR code in byte mode defaults to ISO/IEC 8859-1 — 256 characters, chosen in the 1990s. Anything outside that set depends on your generator adding an ECI marker and your reader honouring it. Paste your text to see which characters are safe, which are already lost, and what a reader that guesses wrong will display.
Paste the final text, after it has been through whatever document or spreadsheet it came from. Autocorrect is where most of these problems are introduced.
1. What a Latin-1 generator writes
The byte-mode default. This is what ends up inside the code.
2. What a reader guessing Latin-1 shows
Your UTF-8 bytes, read one byte at a time. The classic mojibake.
A box (▯) in a preview stands for a byte that has no printable glyph — Latin-1 maps all 256 byte values, but the control ranges show as nothing at all, which is why mojibake often looks shorter than it is.
How this is worked out
A QR code does not store characters. It stores bits, and byte mode stores them eight at a time. Turning your text into those bytes, and turning them back again, needs a character set — and the code itself carries no reliable statement of which one was used.
1. The default is a 1987 character set
ISO/IEC 18004 defines the default interpretation of byte mode data as ISO/IEC 8859-1. That set covers exactly the code points U+0000 to U+00FF: ASCII, plus the accented letters of Western European languages, plus a handful of symbols. It has 256 slots and every one of them was allocated before the euro existed. So this tool's first test is simply whether each character's code point is at or below U+00FF.
2. Characters above U+00FF are lost at generation time
A generator falling back to the default has no byte to write for a character outside the set. The
widely used ZXing library, whose encoder declares
DEFAULT_BYTE_MODE_ENCODING = StandardCharsets.ISO_8859_1, passes the text through that
charset, and the standard Java behaviour is to substitute a question mark for every unmappable
character. That substitution happens before a single module is drawn. The original character is not
in the code, not recoverable, and not the scanner's fault.
3. Characters inside the set survive, but ambiguously
An é is U+00E9, so Latin-1 writes it as the single byte E9 and UTF-8 writes it
as the two bytes C3 A9. Both are legal. Nothing in the symbol says which happened — unless
the generator added an ECI marker, and ZXing's encoder only does that when the calling code explicitly
supplies a character-set hint. Most callers do not.
4. So the reader guesses
Faced with no ECI, readers do not fall back to the standard's default — they try to work it out. ZXing's
StringUtils tests for a UTF-16 byte-order mark, then for valid UTF-8 multi-byte sequences,
then for Shift_JIS, then settles on ISO-8859-1 by elimination, and if all of that fails it returns
Charset.defaultCharset(): the character set of the device doing the reading. That last
step is why one physical code can produce different text on two phones, and why "it works on mine" is
not evidence that a code is correct.
5. The size arithmetic
Byte mode charges 8 bits per byte, so an accented character in UTF-8 costs twice what an ASCII one does and a four-byte emoji costs four times. Numeric mode packs three digits into 10 bits and alphanumeric mode packs two characters into 11, which is why a string of capitals is meaningfully smaller than the same string in lower case. The version figure comes from the same capacity table as the QR code capacity calculator, derived from the codeword counts in ISO/IEC 18004.
When to reach for this
Before a print run in any language but English
Menus, packaging and signage in French, German, Spanish, Polish or Czech all carry characters that behave differently. Check the exact string before the artwork is signed off, then size the code with the print size calculator.
When a scanned code shows question marks
That is a generation fault, not a reading fault, and this page shows you which characters caused it. Regenerating with a UTF-8-capable generator is the only fix.
Wi-Fi passwords and contact cards
A network name or password with an accent in it is the classic silent failure. Check the characters here, then check the payload's structure in the payload decoder, which handles the separate problem of escaping.
After text has been through a document
Word, Google Docs, Pages and InDesign all substitute curly quotes and long dashes automatically. Text that was safe when you wrote it may not be safe by the time it reaches the generator.
Frequently Asked Questions
Why does my QR code show é instead of é?
Because the code carries bytes, not characters, and nothing inside it told the reader which character set those bytes belong to. Your generator wrote é as the two UTF-8 bytes C3 A9; the reader interpreted them one byte at a time as ISO/IEC 8859-1 and got à followed by ©. The data is intact — only the interpretation is wrong, so the same code may read correctly on a different phone.
Why does the € sign break when £ works fine?
ISO/IEC 8859-1 was published in 1987 and covers exactly the code points U+0000 to U+00FF. The pound sign is U+00A3, so it sits inside that range. The euro sign is U+20AC, introduced years later, so it does not. A generator that falls back to ISO/IEC 8859-1 cannot represent the euro sign at all and substitutes a question mark before the code is even drawn.
What is ECI and why does it matter?
ECI stands for Extended Channel Interpretation. It is an optional marker a generator can place at the front of the data to declare which character set follows — assignment number 26 means UTF-8. Without it, byte mode means ISO/IEC 8859-1 by default and a reader has to guess. Most generators only emit an ECI marker when the calling code explicitly asks for a character set, which is why so many codes carry UTF-8 bytes with nothing to say so.
What does a question mark in my scanned text mean?
It usually means the character was destroyed when the code was generated, not when it was read. An encoder falling back to ISO/IEC 8859-1 replaces every character it cannot map with a question mark, and that substitution is permanent — the original character is not in the code anywhere. No scanner can recover it. Regenerate the code with a generator that supports UTF-8.
Can a QR code contain emoji?
Physically yes — an emoji is four UTF-8 bytes and byte mode will carry any byte value. Reliably, no. Emoji sit far outside ISO/IEC 8859-1, so a generator without UTF-8 support replaces each one with a question mark, and a reader that guesses the wrong character set shows several stray symbols instead. For anything printed, treat emoji as decoration around the code rather than content inside it.
Why does typing in Word or InDesign break my QR code?
Because of autocorrect rather than the QR code. Word processors and page-layout tools silently replace the typewriter apostrophe with a curly one (U+2019), hyphens with en and em dashes, and quotes with curly quotes. All of those are outside ISO/IEC 8859-1 while their plain ASCII originals are not, so text that was safe becomes lossy the moment it is retyped in a document. Paste your text here after it has been through the document, not before.
Does using only capital letters really make the code smaller?
Yes, when the whole string qualifies. QR alphanumeric mode covers 45 characters — the digits, capital A to Z, space, and $ % * + - . / : — and packs them at 5.5 bits each instead of byte mode's 8. HELLO WORLD needs 61 data bits where hello world needs 88. It only helps if every character qualifies: one lower-case letter, comma or apostrophe drops the whole string back to byte mode.
Is the text I paste here sent anywhere?
No. The character classification, the UTF-8 encoding and the previews all run in your browser, and there is no network request — you can load the page, switch off your connection and it still works. That matters here because the text people check is often an unreleased URL or a customer name.
The full story — why the default is a 1987 character set, what ECI actually does, and how to tell an encoding bug from a reader bug — is in why QR codes mangle accents, emoji and the euro sign.
Frequently Asked Questions
Why does my QR code show é instead of é?
Because the code carries bytes, not characters, and nothing inside it told the reader which character set those bytes belong to. Your generator wrote é as the two UTF-8 bytes C3 A9; the reader interpreted them one byte at a time as ISO/IEC 8859-1 and got à followed by ©. The data is intact — only the interpretation is wrong, so the same code may read correctly on a different phone.
Why does the € sign break when £ works fine?
ISO/IEC 8859-1 was published in 1987 and covers exactly the code points U+0000 to U+00FF. The pound sign is U+00A3, so it sits inside that range. The euro sign is U+20AC, introduced years later, so it does not. A generator that falls back to ISO/IEC 8859-1 cannot represent the euro sign at all and substitutes a question mark before the code is even drawn.
What is ECI and why does it matter?
ECI stands for Extended Channel Interpretation. It is an optional marker a generator can place at the front of the data to declare which character set follows — assignment number 26 means UTF-8. Without it, byte mode means ISO/IEC 8859-1 by default and a reader has to guess. Most generators only emit an ECI marker when the calling code explicitly asks for a character set, which is why so many codes carry UTF-8 bytes with nothing to say so.
What does a question mark in my scanned text mean?
It usually means the character was destroyed when the code was generated, not when it was read. An encoder falling back to ISO/IEC 8859-1 replaces every character it cannot map with a question mark, and that substitution is permanent — the original character is not in the code anywhere. No scanner can recover it. Regenerate the code with a generator that supports UTF-8.
Can a QR code contain emoji?
Physically yes — an emoji is four UTF-8 bytes and byte mode will carry any byte value. Reliably, no. Emoji sit far outside ISO/IEC 8859-1, so a generator without UTF-8 support replaces each one with a question mark, and a reader that guesses the wrong character set shows several stray symbols instead. For anything printed, treat emoji as decoration around the code rather than content inside it.
Why does typing in Word or InDesign break my QR code?
Because of autocorrect rather than the QR code. Word processors and page-layout tools silently replace the typewriter apostrophe with a curly one (U+2019), hyphens with en and em dashes, and quotes with curly quotes. All of those are outside ISO/IEC 8859-1 while their plain ASCII originals are not, so text that was safe becomes lossy the moment it is retyped in a document. Paste your text here after it has been through the document, not before.
Does using only capital letters really make the code smaller?
Yes, when the whole string qualifies. QR alphanumeric mode covers 45 characters — the digits, capital A to Z, space, and $ % * + - . / : — and packs them at 5.5 bits each instead of byte mode's 8. HELLO WORLD needs 61 data bits where hello world needs 88. It only helps if every character qualifies: one lower-case letter, comma or apostrophe drops the whole string back to byte mode.
Is the text I paste here sent anywhere?
No. The character classification, the UTF-8 encoding and the previews all run in your browser, and there is no network request — you can load the page, switch off your connection and it still works. That matters here because the text people check is often an unreleased URL or a customer name.
Read What the Code Actually Says
Scan & Generate shows the decoded text of a code before acting on it, which is how you tell an encoding bug apart from a reader bug — question marks mean the code is broken, gibberish means it is not.