Short answer: A flag emoji isn’t one character. It’s two letters from a special alphabet, sitting side by side, which your device is supposed to recognise as a country code and draw as a flag. Windows doesn’t draw them โ Microsoft’s emoji font contains no country flags โ so you see the two letters instead. The characters are correct; the font is the problem.
A flag is two letters
Unicode never encoded individual flags. Instead it encoded a parallel alphabet โ Regional Indicator Symbol Letters A to Z, at U+1F1E6 to U+1F1FF โ and defined the rule that two of them in a row form a country code.
So the Serbian flag is regional indicator R followed by regional indicator S:
| Flag | Code | Code points | HTML |
|---|---|---|---|
| ๐ท๐ธ | RS | U+1F1F7 U+1F1F8 | 🇷🇸 |
| ๐บ๐ธ | US | U+1F1FA U+1F1F8 | 🇺🇸 |
| ๐ฌ๐ง | GB | U+1F1EC U+1F1E7 | 🇬🇧 |
| ๐ฏ๐ต | JP | U+1F1EF U+1F1F5 | 🇯🇵 |
| ๐ฉ๐ช | DE | U+1F1E9 U+1F1EA | 🇩🇪 |
| ๐ซ๐ท | FR | U+1F1EB U+1F1F7 | 🇫🇷 |
| ๐ง๐ท | BR | U+1F1E7 U+1F1F7 | 🇧🇷 |
The codes are ISO 3166-1 alpha-2 โ the same two-letter codes used for domains and currencies. This design was deliberate. It means Unicode never has to rule on what counts as a country: it just encodes 26 letters, and the rest is a rendering decision made by whoever ships the font. Background on how encoding and rendering differ is in what Unicode is.
That decision is exactly where Windows diverges from everyone else.
Why Windows shows “RS” instead of ๐ท๐ธ
Windows renders emoji through Segoe UI Emoji, and that font contains no country flag glyphs. When it meets a regional indicator pair it falls back to drawing the two letters, boxed. Microsoft’s stated reasoning is neutrality โ a font that draws flags has to take a position on which territories get one, in every market Microsoft operates in.

This has been the behaviour across Windows 10 and Windows 11, and it hasn’t changed through recent releases.
There is one important exception, and it catches people out because it makes the problem look intermittent:
- Firefox on Windows ships its own flag emoji font, so flags render normally there.
- Chromium browsers โ Chrome and Edge โ don’t, so the same page shows letters.
So “flags work in one browser and not another, on the same PC” is expected, not a fault with your system. If you’ve been told your post looks broken by one person and fine by another, this is usually why.
Note that this is a different problem from symbols showing as empty boxes. A box means no font has a glyph at all. Letter pairs mean the font recognised the characters perfectly well and chose to draw them as letters.
What you see, where
| Platform | Result |
|---|---|
| iPhone, iPad, Mac | Flag |
| Android | Flag |
| Windows โ Firefox | Flag |
| Windows โ Chrome, Edge, most apps | Two boxed letters |
| Linux | Flag, if the installed emoji font covers them |
| Web apps with their own emoji font | Flag, regardless of OS |
That last row explains why flags look fine in Slack, WhatsApp Web or Discord on a Windows PC โ those apps override the system font with their own emoji set. See symbols in Discord and symbols in Slack.
England, Scotland and Wales work differently
These three aren’t countries in ISO 3166-1, so they can’t be built from two regional indicators. They use a second, stranger mechanism: a waving black flag followed by invisible tag characters spelling the subdivision code, then a terminator.
The England flag is seven code points:
U+1F3F4 WAVING BLACK FLAG
U+E0067 TAG LATIN SMALL LETTER G
U+E0062 TAG LATIN SMALL LETTER B
U+E0065 TAG LATIN SMALL LETTER E
U+E006E TAG LATIN SMALL LETTER N
U+E0067 TAG LATIN SMALL LETTER G
U+E007F CANCEL TAG
The tag characters are invisible by design. If a platform doesn’t support the sequence you see a plain black flag with nothing after it, because the letters genuinely have no visible form. Support for these is thinner than for the two-letter flags, so they’re a poor choice anywhere it matters.
Windows
You can insert flag emoji perfectly well โ you just won’t see them.
- Press Windows key + . to open the emoji panel, and pick a flag. The correct characters go into your document. See the Windows emoji shortcut.
- Copy one from the table above.
There are no Alt codes for flags. Regional indicators sit above U+FFFF, far beyond the legacy Alt code range, and there’s no Alt + X route for a two-character sequence either.
If you need to see flags on Windows, the options are: use Firefox, use an app that ships its own emoji font, or install a third-party flag font. That last one works, but it means replacing a system font with an unsigned one โ weigh that before doing it on a work machine.
Mac
Control + Command + Space opens the Character Viewer; flags are under Flags. See the Mac emoji shortcut.
Unicode Hex Input can’t help here. It only handles characters in the Basic Multilingual Plane, and every regional indicator is above it. For flags, the Character Viewer is the only route โ the same limitation that applies to all emoji on macOS.
iPhone, Android and Linux
- iPhone and Android: the emoji keyboard has a flags section, and both render them properly. Cross-platform differences are covered in iPhone vs Android symbols.
- Linux: Ctrl + Shift + U then
1f1f7enters a single regional indicator; you’d need to do it twice to build a flag. Copying is easier. Whether it draws depends on your emoji font โ Noto Color Emoji covers flags.
In code
Flags surprise developers more than almost any other character, because the intuitive length is wrong twice over.
javascript
"๐ท๐ธ".length // 4 โ two code points, each a surrogate pair
[..."๐ท๐ธ"].length // 2 โ two code points
// there is no measure that returns 1
Slicing a string mid-flag produces a lone regional indicator, which renders as a boxed letter. Truncating user text to a character count โ bios, previews, tweets โ is the usual way this bug ships.
Building a flag from a country code is a clean transform, since the regional indicators run in alphabetical order:
javascript
const flag = cc => [...cc.toUpperCase()]
.map(c => String.fromCodePoint(0x1F1E6 + c.charCodeAt(0) - 65))
.join("");
flag("rs"); // ๐ท๐ธ
In HTML, use the two numeric references together, as in the table above. And note that Excel’s UNICHAR can’t build these โ a flag needs two characters concatenated, and support above U+FFFF is inconsistent. Use a lookup column of pasted flags instead of trying to generate them.
Accessibility
Screen readers announce a complete flag sequence by its CLDR name โ “flag: Serbia” โ which is good. A broken sequence is announced as “regional indicator symbol letter R”, which tells a listener nothing.
Since a reader on Windows may be seeing letters rather than a flag, don’t let a flag carry meaning on its own. Write the country name and treat the flag as decoration. How screen readers pronounce symbols covers the wider pattern.
Troubleshooting
| Problem | Fix |
|---|---|
| Flags show as two boxed letters on Windows | Expected. Segoe UI Emoji has no flag glyphs. Use Firefox, or an app with its own emoji font. |
| Flags work in Firefox but not Chrome | Also expected. Firefox bundles a flag font; Chromium relies on the system one. |
| One flag broke and shows a single letter | The sequence was split โ usually by a character-count truncation. Slice by code point, not by length. |
| England flag shows as a plain black flag | That platform doesn’t support tag sequences. The invisible tag characters have no fallback glyph. |
| No Alt code works | Correct. Flags are above U+FFFF; legacy Alt codes and Alt + X can’t reach them. |
| Unicode Hex Input won’t enter it on Mac | It’s limited to the BMP. Use Character Viewer. |
| Flag looks different on another device | Every platform draws its own artwork. Same characters, different design. |
Recap
| Situation | Do this |
|---|---|
| Inserting a flag on Windows | Win + ., or copy above โ it’ll insert correctly even if it displays as letters |
| Needing to see flags on Windows | Firefox, or an app with its own emoji font |
| On a Mac | Control + Command + Space โ Hex Input can’t reach them |
| Writing code | Iterate by code point, never by .length |
| On the web | 🇷🇸 |
| Anywhere the meaning matters | Write the country name too |
Frequently asked questions
Why don’t flag emoji work on Windows?
Windows renders emoji with the Segoe UI Emoji font, which contains no country flag glyphs, so it draws the two underlying letters instead. Microsoft’s stated reason is neutrality about which territories get a flag. The characters in your text are still correct.
Why do flags show in Firefox but not Chrome on the same PC?
Firefox ships its own flag emoji font, so it doesn’t depend on the system one. Chromium browsers use whatever the operating system provides, which on Windows has no flags.
What are regional indicator symbols?
A parallel alphabet at U+1F1E6 to U+1F1FF, one character per letter A to Z. Two of them in a row form an ISO country code, which supporting platforms draw as that country’s flag.
Is there an Alt code for flag emoji?
No. Regional indicators sit above U+FFFF, well beyond the legacy Alt code range, and Alt + X can’t produce a two-character sequence either. Copy them, or use the Windows emoji panel.
Why is the England flag seven characters?
England, Scotland and Wales aren’t in ISO 3166-1, so they use a different mechanism: a waving black flag, then invisible tag characters spelling the subdivision code, then a terminator.
Why does my flag emoji count as four characters in code?
Each flag is two code points, and each of those is stored as a surrogate pair in UTF-16. JavaScript’s .length counts those units, so it returns 4. Iterate by code point instead.
Written by Igor R. Tested on Windows 11, macOS, iOS, Android and Linux, in Chrome, Firefox and Edge. Last updated September 2026. Symbol code points follow the Unicode Standard.