← Blog · Essentials · 5 min read
QR Codes in Other Languages and Emoji: What Changes
A QR code can hold Arabic, Chinese, Russian, Korean, emoji, and all of them mixed in one line. We encoded the same sentence in nine forms with this site's generator and read each one back with two independent decoders, and every one came back exactly as it went in. What changes from one language to the next is how much space the text takes, and that changes how large you need to print the code.
Every character becomes bytes
The QR standard has compact modes for digits and for capital letters with a few symbols, and a Kanji mode for Japanese in the older Shift JIS encoding. Everything else, including lowercase letters, accented letters, other scripts and emoji, is stored as bytes. This site's generator stores all text as bytes, written as UTF-8, where the number of bytes per character depends on the script:
| Character | Example | UTF-8 bytes |
|---|---|---|
| Basic Latin letter or digit | a | 1 |
| Accented Latin letter | é | 2 |
| Cyrillic, Greek, Arabic or Hebrew letter | ж ب | 2 |
| Chinese, Japanese or Korean character | 中 | 3 |
| Emoji | 👍 | 4 |
| Emoji with a skin tone | 👍🏽 | 8 |
| Flag | 🇶🇦 | 8 |
| Family emoji (man, woman, girl) | 👨👩👧 | 18 |
The last three rows surprise people. Many emoji that look like one symbol are really several joined together: a flag is two regional letters, and a skin tone is a second code point. The three-person family emoji in the last row costs as much as eighteen Latin letters.
Measured: one message in seven languages, emoji and a mixed line
| Sample | Characters | UTF-8 bytes | Level M | Level H |
|---|---|---|---|---|
| English | 43 | 45 | v4 · 33 | v6 · 41 |
| French | 49 | 49 | v4 · 33 | v6 · 41 |
| Russian | 46 | 85 | v6 · 41 | v9 · 53 |
| Arabic | 41 | 76 | v5 · 37 | v8 · 49 |
| Chinese | 13 | 39 | v3 · 29 | v5 · 37 |
| Japanese | 16 | 48 | v4 · 33 | v6 · 41 |
| Korean | 19 | 51 | v4 · 33 | v6 · 41 |
| Emoji | 41 | 54 | v4 · 33 | v6 · 41 |
| Arabic + English | 26 | 37 | v3 · 29 | v5 · 37 |
The same message in Russian takes 85 bytes where English takes 45. At error-correction level M that moves the code from version 4 (33 modules across) to version 6 (41); at level H, from 41 to 53. Chinese goes the other way: three bytes per character, but the sentence needs only 13 characters, so the total is smaller than the English.
What it means for printing
More modules in the same printed square means each module is smaller. Printed 30 mm wide at level M, the English code (33 modules, plus four modules of margin on each side) has modules about 0.73 mm wide; the Russian code (41 modules) about 0.61 mm. At level H the Russian code's modules shrink to about 0.49 mm, and a phone has to resolve them from the same distance. Either print larger or keep the text short. The print-size guide gives the rule for distance, and the size reference has the full table.
- Put long text on a web page and encode its address instead. A web address is mostly plain Latin characters at one byte each.
- Watch copied addresses. When a web address contains non-Latin words, browsers often copy it in percent-encoded form, where every byte becomes three characters. The seven-letter Arabic word القائمة is 14 bytes as text and 42 characters percent-encoded. Short addresses in plain Latin letters keep the code small.
- Use emoji sparingly in codes that must print small.
Right-to-left text needs nothing special
Arabic and Hebrew are stored in reading order, the same order you type them. Displaying them right to left is the phone's job once the text is decoded. Our mixed sample, with Arabic, English and digits on one line, decoded byte-for-byte identical in both decoders. There is nothing to set.
The one compatibility caveat
The QR standard's default interpretation of byte data is Latin-1 (ISO 8859-1), which predates UTF-8. Modern phone readers detect UTF-8 and display it correctly, and both decoders we tested did. A very old or basic reader can instead show garbled characters. Some generators add a marker (an "ECI") that declares UTF-8 explicitly; this site writes plain UTF-8 without one. If your code will be read by dedicated older hardware, such as a ticket gate or a warehouse scanner, test it on that hardware before printing.
Any script and any emoji, stored as UTF-8.
Make a QR code →