Ben Dodson

Freelance iOS, macOS, Apple Watch, and Apple TV Developer

Emoji flags from ISO 3166-1 country codes (in Swift)

I’m working on a personal project currently that works heavily with country codes and the selection of countries. To make it look better, I wanted to use a flag icon for each country in the list. In the past, this would have been done with a load of imported images named something like “gb.png” but luckily there is a modern solution; emoji!

As of iOS 9.0, every ISO 3166-1 country now has a corresponding emoji flag1. The way to build them is also incredibly simple as you basically put the two letters together as joined Unicode characters. Benjamin Esham explains it like this:

What they did is both crazy and genius. Instead of assigning a codepoint to each flag, which is the obvious way to do it (and the way the rest of the emoji are encoded), the standard defines twenty-six “regional indicator symbols”, from U+1F1E6 REGIONAL INDICATOR SYMBOL LETTER A to U+1F1FF REGIONAL INDICATOR SYMBOL LETTER Z. In order to include a country’s flag in your text, you first look up the country’s two-letter ISO 3166-1 code and then write the two regional indicator symbols corresponding to those letters. A font with support for that flag treats the two-codepoint sequence as a ligature, replacing the combination with a single pictogram.

Let’s take the United States as an example. Its ISO 3166-1 two-letter code is “us”, so we need to use the codepoints U+1F1FA REGIONAL INDICATOR SYMBOL LETTER U and U+1F1F8 REGIONAL INDICATOR SYMBOL LETTER S. Combining these gives a symbol that renders in your browser as 🇺🇸.

Armed with this information, it is easy to write a basic function to turn a code like “us” into the corresponding flag emoji:

func emojiFlag(countryCode countryCode: String) -> String {
    var string = ""
    var country = countryCode.uppercaseString
    for uS in country.unicodeScalars {
        string.append(UnicodeScalar(127397 + uS.value))
    return string

A great way of testing this is with an Xcode Playground which will allow you to quickly see the output like such:

If you use an incorrect code such as “en”2 then you’ll be given back the letters within boxes.

You can download my example playground from GitHub.

  1. Most were supported in iOS 8.3 but hidden from the emoji keyboard; iOS 9.0 added an extra 40 to complete the set including such places as Antarctica and Taiwan. They also added support for the EU flag. ↩︎

  2. England is not an iOS 3166-1 country and so there is no “en” code. There is a proposal for subdivisions to be supported so something like “gb-eng” would work but it is not accepted yet and iOS has no flags for places like England, Wales, or Scotland. ↩︎

The Divide #12 - Reboots » « iPhone 7 headphone predictions