Flag emoji: why Windows shows letters instead of flags

Igor R.

September 21, 2026

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:

FlagCodeCode pointsHTML
๐Ÿ‡ท๐Ÿ‡ธRSU+1F1F7 U+1F1F8🇷🇸
๐Ÿ‡บ๐Ÿ‡ธUSU+1F1FA U+1F1F8🇺🇸
๐Ÿ‡ฌ๐Ÿ‡งGBU+1F1EC U+1F1E7🇬🇧
๐Ÿ‡ฏ๐Ÿ‡ตJPU+1F1EF U+1F1F5🇯🇵
๐Ÿ‡ฉ๐Ÿ‡ชDEU+1F1E9 U+1F1EA🇩🇪
๐Ÿ‡ซ๐Ÿ‡ทFRU+1F1EB U+1F1F7🇫🇷
๐Ÿ‡ง๐Ÿ‡ทBRU+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.

Flag emoji rendering on Windows compared with a phone

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

PlatformResult
iPhone, iPad, MacFlag
AndroidFlag
Windows โ€” FirefoxFlag
Windows โ€” Chrome, Edge, most appsTwo boxed letters
LinuxFlag, if the installed emoji font covers them
Web apps with their own emoji fontFlag, 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.

  1. Press Windows key + . to open the emoji panel, and pick a flag. The correct characters go into your document. See the Windows emoji shortcut.
  2. 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 1f1f7 enters 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

ProblemFix
Flags show as two boxed letters on WindowsExpected. Segoe UI Emoji has no flag glyphs. Use Firefox, or an app with its own emoji font.
Flags work in Firefox but not ChromeAlso expected. Firefox bundles a flag font; Chromium relies on the system one.
One flag broke and shows a single letterThe sequence was split โ€” usually by a character-count truncation. Slice by code point, not by length.
England flag shows as a plain black flagThat platform doesn’t support tag sequences. The invisible tag characters have no fallback glyph.
No Alt code worksCorrect. Flags are above U+FFFF; legacy Alt codes and Alt + X can’t reach them.
Unicode Hex Input won’t enter it on MacIt’s limited to the BMP. Use Character Viewer.
Flag looks different on another deviceEvery platform draws its own artwork. Same characters, different design.

Recap

SituationDo this
Inserting a flag on WindowsWin + ., or copy above โ€” it’ll insert correctly even if it displays as letters
Needing to see flags on WindowsFirefox, or an app with its own emoji font
On a MacControl + Command + Space โ€” Hex Input can’t reach them
Writing codeIterate by code point, never by .length
On the web🇷🇸
Anywhere the meaning mattersWrite 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.

Leave a Comment