Skip to content

Instantly share code, notes, and snippets.

@RienNeVaPlus
Last active September 18, 2023 19:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RienNeVaPlus/307d19b1c33fbb2545eca5c83d3bad83 to your computer and use it in GitHub Desktop.
Save RienNeVaPlus/307d19b1c33fbb2545eca5c83d3bad83 to your computer and use it in GitHub Desktop.
๐Ÿ A TypeScript function that returns the unicode flag icon for a two-digit country code or a locale
/**
* ๐Ÿ Returns an unicode-emoji-flag-icon for a two digit country code or a locale (eg. en-US)
* - Supports 239 countries
*
* @param {String} countryCode - the country code to display a flag for (eg. US)
* @param {String} [fallback=๐Ÿณ] - fallback icon when no matching flag has been found
* @param {Object} [countryFlagData] - an object of country code : flag
*/
export function emojiFlag(countryCode: string, fallback: string = '๐Ÿณ', countryFlagData: {[key: string]: string} = {
AD: '๐Ÿ‡ฆ๐Ÿ‡ฉ', AE: '๐Ÿ‡ฆ๐Ÿ‡ช', AF: '๐Ÿ‡ฆ๐Ÿ‡ซ', AG: '๐Ÿ‡ฆ๐Ÿ‡ฌ', AI: '๐Ÿ‡ฆ๐Ÿ‡ฎ', AL: '๐Ÿ‡ฆ๐Ÿ‡ฑ', AM: '๐Ÿ‡ฆ๐Ÿ‡ฒ', AO: '๐Ÿ‡ฆ๐Ÿ‡ด', AQ: '๐Ÿ‡ฆ๐Ÿ‡ถ', AR: '๐Ÿ‡ฆ๐Ÿ‡ท',
AS: '๐Ÿ‡ฆ๐Ÿ‡ธ', AT: '๐Ÿ‡ฆ๐Ÿ‡น', AU: '๐Ÿ‡ฆ๐Ÿ‡บ', AW: '๐Ÿ‡ฆ๐Ÿ‡ผ', AX: '๐Ÿ‡ฆ๐Ÿ‡ฝ', AZ: '๐Ÿ‡ฆ๐Ÿ‡ฟ', BA: '๐Ÿ‡ง๐Ÿ‡ฆ', BB: '๐Ÿ‡ง๐Ÿ‡ง', BD: '๐Ÿ‡ง๐Ÿ‡ฉ', BE: '๐Ÿ‡ง๐Ÿ‡ช',
BF: '๐Ÿ‡ง๐Ÿ‡ซ', BG: '๐Ÿ‡ง๐Ÿ‡ฌ', BH: '๐Ÿ‡ง๐Ÿ‡ญ', BI: '๐Ÿ‡ง๐Ÿ‡ฎ', BJ: '๐Ÿ‡ง๐Ÿ‡ฏ', BL: '๐Ÿ‡ง๐Ÿ‡ฑ', BM: '๐Ÿ‡ง๐Ÿ‡ฒ', BN: '๐Ÿ‡ง๐Ÿ‡ณ', BO: '๐Ÿ‡ง๐Ÿ‡ด', BQ: '๐Ÿ‡ง๐Ÿ‡ถ',
BR: '๐Ÿ‡ง๐Ÿ‡ท', BS: '๐Ÿ‡ง๐Ÿ‡ธ', BT: '๐Ÿ‡ง๐Ÿ‡น', BV: '๐Ÿ‡ง๐Ÿ‡ป', BW: '๐Ÿ‡ง๐Ÿ‡ผ', BY: '๐Ÿ‡ง๐Ÿ‡พ', BZ: '๐Ÿ‡ง๐Ÿ‡ฟ', CA: '๐Ÿ‡จ๐Ÿ‡ฆ', CC: '๐Ÿ‡จ๐Ÿ‡จ', CD: '๐Ÿ‡จ๐Ÿ‡ฉ',
CF: '๐Ÿ‡จ๐Ÿ‡ซ', CG: '๐Ÿ‡จ๐Ÿ‡ฌ', CH: '๐Ÿ‡จ๐Ÿ‡ญ', CI: '๐Ÿ‡จ๐Ÿ‡ฎ', CK: '๐Ÿ‡จ๐Ÿ‡ฐ', CL: '๐Ÿ‡จ๐Ÿ‡ฑ', CM: '๐Ÿ‡จ๐Ÿ‡ฒ', CN: '๐Ÿ‡จ๐Ÿ‡ณ', CO: '๐Ÿ‡จ๐Ÿ‡ด', CR: '๐Ÿ‡จ๐Ÿ‡ท',
CU: '๐Ÿ‡จ๐Ÿ‡บ', CV: '๐Ÿ‡จ๐Ÿ‡ป', CW: '๐Ÿ‡จ๐Ÿ‡ผ', CX: '๐Ÿ‡จ๐Ÿ‡ฝ', CY: '๐Ÿ‡จ๐Ÿ‡พ', CZ: '๐Ÿ‡จ๐Ÿ‡ฟ', DE: '๐Ÿ‡ฉ๐Ÿ‡ช', DJ: '๐Ÿ‡ฉ๐Ÿ‡ฏ', DK: '๐Ÿ‡ฉ๐Ÿ‡ฐ', DM: '๐Ÿ‡ฉ๐Ÿ‡ฒ',
DO: '๐Ÿ‡ฉ๐Ÿ‡ด', DZ: '๐Ÿ‡ฉ๐Ÿ‡ฟ', EC: '๐Ÿ‡ช๐Ÿ‡จ', EE: '๐Ÿ‡ช๐Ÿ‡ช', EG: '๐Ÿ‡ช๐Ÿ‡ฌ', EH: '๐Ÿ‡ช๐Ÿ‡ญ', ER: '๐Ÿ‡ช๐Ÿ‡ท', ES: '๐Ÿ‡ช๐Ÿ‡ธ', ET: '๐Ÿ‡ช๐Ÿ‡น', FI: '๐Ÿ‡ซ๐Ÿ‡ฎ',
FJ: '๐Ÿ‡ซ๐Ÿ‡ฏ', FK: '๐Ÿ‡ซ๐Ÿ‡ฐ', FM: '๐Ÿ‡ซ๐Ÿ‡ฒ', FO: '๐Ÿ‡ซ๐Ÿ‡ด', FR: '๐Ÿ‡ซ๐Ÿ‡ท', GA: '๐Ÿ‡ฌ๐Ÿ‡ฆ', GB: '๐Ÿ‡ฌ๐Ÿ‡ง', GD: '๐Ÿ‡ฌ๐Ÿ‡ฉ', GE: '๐Ÿ‡ฌ๐Ÿ‡ช', GF: '๐Ÿ‡ฌ๐Ÿ‡ซ',
GG: '๐Ÿ‡ฌ๐Ÿ‡ฌ', GH: '๐Ÿ‡ฌ๐Ÿ‡ญ', GI: '๐Ÿ‡ฌ๐Ÿ‡ฎ', GL: '๐Ÿ‡ฌ๐Ÿ‡ฑ', GM: '๐Ÿ‡ฌ๐Ÿ‡ฒ', GN: '๐Ÿ‡ฌ๐Ÿ‡ณ', GP: '๐Ÿ‡ฌ๐Ÿ‡ต', GQ: '๐Ÿ‡ฌ๐Ÿ‡ถ', GR: '๐Ÿ‡ฌ๐Ÿ‡ท', GS: '๐Ÿ‡ฌ๐Ÿ‡ธ',
GT: '๐Ÿ‡ฌ๐Ÿ‡น', GU: '๐Ÿ‡ฌ๐Ÿ‡บ', GW: '๐Ÿ‡ฌ๐Ÿ‡ผ', GY: '๐Ÿ‡ฌ๐Ÿ‡พ', HK: '๐Ÿ‡ญ๐Ÿ‡ฐ', HM: '๐Ÿ‡ญ๐Ÿ‡ฒ', HN: '๐Ÿ‡ญ๐Ÿ‡ณ', HR: '๐Ÿ‡ญ๐Ÿ‡ท', HT: '๐Ÿ‡ญ๐Ÿ‡น', HU: '๐Ÿ‡ญ๐Ÿ‡บ',
ID: '๐Ÿ‡ฎ๐Ÿ‡ฉ', IE: '๐Ÿ‡ฎ๐Ÿ‡ช', IL: '๐Ÿ‡ฎ๐Ÿ‡ฑ', IM: '๐Ÿ‡ฎ๐Ÿ‡ฒ', IN: '๐Ÿ‡ฎ๐Ÿ‡ณ', IO: '๐Ÿ‡ฎ๐Ÿ‡ด', IQ: '๐Ÿ‡ฎ๐Ÿ‡ถ', IR: '๐Ÿ‡ฎ๐Ÿ‡ท', IS: '๐Ÿ‡ฎ๐Ÿ‡ธ', IT: '๐Ÿ‡ฎ๐Ÿ‡น',
JE: '๐Ÿ‡ฏ๐Ÿ‡ช', JM: '๐Ÿ‡ฏ๐Ÿ‡ฒ', JO: '๐Ÿ‡ฏ๐Ÿ‡ด', JP: '๐Ÿ‡ฏ๐Ÿ‡ต', KE: '๐Ÿ‡ฐ๐Ÿ‡ช', KG: '๐Ÿ‡ฐ๐Ÿ‡ฌ', KH: '๐Ÿ‡ฐ๐Ÿ‡ญ', KI: '๐Ÿ‡ฐ๐Ÿ‡ฎ', KM: '๐Ÿ‡ฐ๐Ÿ‡ฒ', KN: '๐Ÿ‡ฐ๐Ÿ‡ณ',
KP: '๐Ÿ‡ฐ๐Ÿ‡ต', KR: '๐Ÿ‡ฐ๐Ÿ‡ท', KW: '๐Ÿ‡ฐ๐Ÿ‡ผ', KY: '๐Ÿ‡ฐ๐Ÿ‡พ', KZ: '๐Ÿ‡ฐ๐Ÿ‡ฟ', LA: '๐Ÿ‡ฑ๐Ÿ‡ฆ', LB: '๐Ÿ‡ฑ๐Ÿ‡ง', LC: '๐Ÿ‡ฑ๐Ÿ‡จ', LI: '๐Ÿ‡ฑ๐Ÿ‡ฎ', LK: '๐Ÿ‡ฑ๐Ÿ‡ฐ',
LR: '๐Ÿ‡ฑ๐Ÿ‡ท', LS: '๐Ÿ‡ฑ๐Ÿ‡ธ', LT: '๐Ÿ‡ฑ๐Ÿ‡น', LU: '๐Ÿ‡ฑ๐Ÿ‡บ', LV: '๐Ÿ‡ฑ๐Ÿ‡ป', LY: '๐Ÿ‡ฑ๐Ÿ‡พ', MA: '๐Ÿ‡ฒ๐Ÿ‡ฆ', MC: '๐Ÿ‡ฒ๐Ÿ‡จ', MD: '๐Ÿ‡ฒ๐Ÿ‡ฉ', ME: '๐Ÿ‡ฒ๐Ÿ‡ช',
MF: '๐Ÿ‡ฒ๐Ÿ‡ซ', MG: '๐Ÿ‡ฒ๐Ÿ‡ฌ', MH: '๐Ÿ‡ฒ๐Ÿ‡ญ', MK: '๐Ÿ‡ฒ๐Ÿ‡ฐ', ML: '๐Ÿ‡ฒ๐Ÿ‡ฑ', MM: '๐Ÿ‡ฒ๐Ÿ‡ฒ', MN: '๐Ÿ‡ฒ๐Ÿ‡ณ', MO: '๐Ÿ‡ฒ๐Ÿ‡ด', MP: '๐Ÿ‡ฒ๐Ÿ‡ต', MQ: '๐Ÿ‡ฒ๐Ÿ‡ถ',
MR: '๐Ÿ‡ฒ๐Ÿ‡ท', MS: '๐Ÿ‡ฒ๐Ÿ‡ธ', MT: '๐Ÿ‡ฒ๐Ÿ‡น', MU: '๐Ÿ‡ฒ๐Ÿ‡บ', MV: '๐Ÿ‡ฒ๐Ÿ‡ป', MW: '๐Ÿ‡ฒ๐Ÿ‡ผ', MX: '๐Ÿ‡ฒ๐Ÿ‡ฝ', MY: '๐Ÿ‡ฒ๐Ÿ‡พ', MZ: '๐Ÿ‡ฒ๐Ÿ‡ฟ', NA: '๐Ÿ‡ณ๐Ÿ‡ฆ',
NC: '๐Ÿ‡ณ๐Ÿ‡จ', NE: '๐Ÿ‡ณ๐Ÿ‡ช', NF: '๐Ÿ‡ณ๐Ÿ‡ซ', NG: '๐Ÿ‡ณ๐Ÿ‡ฌ', NI: '๐Ÿ‡ณ๐Ÿ‡ฎ', NL: '๐Ÿ‡ณ๐Ÿ‡ฑ', NO: '๐Ÿ‡ณ๐Ÿ‡ด', NP: '๐Ÿ‡ณ๐Ÿ‡ต', NR: '๐Ÿ‡ณ๐Ÿ‡ท', NU: '๐Ÿ‡ณ๐Ÿ‡บ',
NZ: '๐Ÿ‡ณ๐Ÿ‡ฟ', OM: '๐Ÿ‡ด๐Ÿ‡ฒ', PA: '๐Ÿ‡ต๐Ÿ‡ฆ', PE: '๐Ÿ‡ต๐Ÿ‡ช', PF: '๐Ÿ‡ต๐Ÿ‡ซ', PG: '๐Ÿ‡ต๐Ÿ‡ฌ', PH: '๐Ÿ‡ต๐Ÿ‡ญ', PK: '๐Ÿ‡ต๐Ÿ‡ฐ', PL: '๐Ÿ‡ต๐Ÿ‡ฑ', PM: '๐Ÿ‡ต๐Ÿ‡ฒ',
PN: '๐Ÿ‡ต๐Ÿ‡ณ', PR: '๐Ÿ‡ต๐Ÿ‡ท', PS: '๐Ÿ‡ต๐Ÿ‡ธ', PT: '๐Ÿ‡ต๐Ÿ‡น', PW: '๐Ÿ‡ต๐Ÿ‡ผ', PY: '๐Ÿ‡ต๐Ÿ‡พ', QA: '๐Ÿ‡ถ๐Ÿ‡ฆ', RE: '๐Ÿ‡ท๐Ÿ‡ช', RO: '๐Ÿ‡ท๐Ÿ‡ด', RS: '๐Ÿ‡ท๐Ÿ‡ธ',
RU: '๐Ÿ‡ท๐Ÿ‡บ', RW: '๐Ÿ‡ท๐Ÿ‡ผ', SA: '๐Ÿ‡ธ๐Ÿ‡ฆ', SB: '๐Ÿ‡ธ๐Ÿ‡ง', SC: '๐Ÿ‡ธ๐Ÿ‡จ', SD: '๐Ÿ‡ธ๐Ÿ‡ฉ', SE: '๐Ÿ‡ธ๐Ÿ‡ช', SG: '๐Ÿ‡ธ๐Ÿ‡ฌ', SH: '๐Ÿ‡ธ๐Ÿ‡ญ', SI: '๐Ÿ‡ธ๐Ÿ‡ฎ',
SJ: '๐Ÿ‡ธ๐Ÿ‡ฏ', SK: '๐Ÿ‡ธ๐Ÿ‡ฐ', SL: '๐Ÿ‡ธ๐Ÿ‡ฑ', SM: '๐Ÿ‡ธ๐Ÿ‡ฒ', SN: '๐Ÿ‡ธ๐Ÿ‡ณ', SO: '๐Ÿ‡ธ๐Ÿ‡ด', SR: '๐Ÿ‡ธ๐Ÿ‡ท', SS: '๐Ÿ‡ธ๐Ÿ‡ธ', ST: '๐Ÿ‡ธ๐Ÿ‡น', SV: '๐Ÿ‡ธ๐Ÿ‡ป',
SX: '๐Ÿ‡ธ๐Ÿ‡ฝ', SY: '๐Ÿ‡ธ๐Ÿ‡พ', SZ: '๐Ÿ‡ธ๐Ÿ‡ฟ', TC: '๐Ÿ‡น๐Ÿ‡จ', TD: '๐Ÿ‡น๐Ÿ‡ฉ', TF: '๐Ÿ‡น๐Ÿ‡ซ', TG: '๐Ÿ‡น๐Ÿ‡ฌ', TH: '๐Ÿ‡น๐Ÿ‡ญ', TJ: '๐Ÿ‡น๐Ÿ‡ฏ', TK: '๐Ÿ‡น๐Ÿ‡ฐ',
TL: '๐Ÿ‡น๐Ÿ‡ฑ', TM: '๐Ÿ‡น๐Ÿ‡ฒ', TN: '๐Ÿ‡น๐Ÿ‡ณ', TO: '๐Ÿ‡น๐Ÿ‡ด', TR: '๐Ÿ‡น๐Ÿ‡ท', TT: '๐Ÿ‡น๐Ÿ‡น', TV: '๐Ÿ‡น๐Ÿ‡ป', TW: '๐Ÿ‡น๐Ÿ‡ผ', TZ: '๐Ÿ‡น๐Ÿ‡ฟ', UA: '๐Ÿ‡บ๐Ÿ‡ฆ',
UG: '๐Ÿ‡บ๐Ÿ‡ฌ', UM: '๐Ÿ‡บ๐Ÿ‡ฒ', US: '๐Ÿ‡บ๐Ÿ‡ธ', UY: '๐Ÿ‡บ๐Ÿ‡พ', UZ: '๐Ÿ‡บ๐Ÿ‡ฟ', VA: '๐Ÿ‡ป๐Ÿ‡ฆ', VC: '๐Ÿ‡ป๐Ÿ‡จ', VE: '๐Ÿ‡ป๐Ÿ‡ช', VG: '๐Ÿ‡ป๐Ÿ‡ฌ', VI: '๐Ÿ‡ป๐Ÿ‡ฎ',
VN: '๐Ÿ‡ป๐Ÿ‡ณ', VU: '๐Ÿ‡ป๐Ÿ‡บ', WF: '๐Ÿ‡ผ๐Ÿ‡ซ', WS: '๐Ÿ‡ผ๐Ÿ‡ธ', XK: '๐Ÿ‡ฝ๐Ÿ‡ฐ', YE: '๐Ÿ‡พ๐Ÿ‡ช', YT: '๐Ÿ‡พ๐Ÿ‡น', ZA: '๐Ÿ‡ฟ๐Ÿ‡ฆ', ZM: '๐Ÿ‡ฟ๐Ÿ‡ฒ'
}){
const arr = countryCode.split('-');
return countryFlagData[(arr[1] || arr[0]).toUpperCase()] || fallback;
}
@RienNeVaPlus
Copy link
Author

RienNeVaPlus commented Jul 6, 2019

emojiFlag('us'); // => ๐Ÿ‡บ๐Ÿ‡ธ
emojiFlag('US'); // => ๐Ÿ‡บ๐Ÿ‡ธ
emojiFlag('en-US'); // => ๐Ÿ‡บ๐Ÿ‡ธ
emojiFlag('USA'); // => ๐Ÿณ
emojiFlag('USB', ''); // => 

@johan
Copy link

johan commented Oct 27, 2021

No need for a fallback; this handles all current and future legal ISO 3166 2-letter country codes without a need for fallbacks, as long as your input is a legal country code, and without the lookup table:

const alphaToFlagAlpha = (a: string) => String.fromCodePoint(0x1f1a5 + a.toUpperCase().codePointAt(0)!);
const emojiFlag = (countryCode: string) => countryCode.slice(0, 2).split("").map(alphaToFlagAlpha).join("");

@johan
Copy link

johan commented Sep 18, 2023

Someone remarked the above one doesn't accept a locale as an input, which is correct; for that to work as in the first one, it needs this:

const emojiFlagFromLocale = (locale: string) => emojiFlag(locale.replace(/^.*-/, ""));

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment