Engineering guide

International Standards Reference

A practical reference to ISO country, currency, and language identifiers, BCP 47 language tags, ITU E.164 phone numbers, and UPU S42 postal addresses.

Reviewed 2 August 2026 · Editorial owner: localization.guide

Choose an identifier for a defined concept

International systems fail when one convenient field is reused for different concepts. GB identifies a country; it does not identify English, pounds sterling, the +44 calling-code zone, or the Europe/London time zone. Store each concept under its own standard, preserve the source version, and map only through explicit data.

Standards at a glance

DomainAuthorityExample identifiersPractical use
Countries and subdivisionsISO 3166GB / GBR / 826; GB-SCTCountry interchange, region selectors, subdivisions, dataset joins
CurrenciesISO 4217GBP / 826; EUR / 978Money records, payment APIs, reports, currency formatting
LanguagesISO 639en; eng; ar; araLanguage identity; source for many BCP 47 language subtags
Language preferencesBCP 47 / RFC 5646en-GB; sr-Latn-RS; ar-EG-u-nu-arabWeb language metadata, locale negotiation, script and region variation
Telephone numbersITU-T E.164+442079460018Globally interoperable public telephone-number representation
Postal addressesUPU S42Country-specific address elements and templatesModel, exchange, and render international postal addresses

ISO 3166: countries and subdivisions

ISO 3166-1 represents countries with alpha-2, alpha-3, and three-digit numeric identifiers. ISO recommends alpha-2 as the general-purpose form; alpha-3 is more recognisable, and numeric-3 avoids dependence on the Latin script. ISO 3166-2 adds subdivision identifiers such as CA-QC or GB-SCT.

Alpha-2

GB

Compact UI, APIs, ccTLD-adjacent country selection

Alpha-3

GBR

Human-readable reports and data interchange

Numeric-3

826

Language-neutral numeric data exchange

Codes and names change. Do not use the display name as the database key, and retain a migration path for renamed, split, merged, or formerly used territories.

ISO 4217: currency identifiers and minor units

ISO 4217 supplies three-letter alphabetic and three-digit numeric currency codes. A money record needs an amount and currency code; the symbol alone is ambiguous because $ is used by many currencies. Minor-unit metadata is useful for display and payment integration, but providers can impose their own operational rules.

type Money = {
  amountMinor: bigint;
  currency: "GBP" | "EUR" | "JPY" | "KWD";
};

const invoiceTotal: Money = {
  amountMinor: 1299n,
  currency: "GBP",
};

// Resolve scale from a versioned currency dataset or the payment contract.
// Format the resulting major-unit value with Intl.NumberFormat.
// Never infer currency from $, locale, IP address, or country alone.

ISO 639 and BCP 47 solve different layers

ISO 639 assigns language identifiers. Web and application locale negotiation normally uses BCP 47 language tags, whose subtags can express language, script, region, variant, and extensions. Use the shortest tag that conveys a real distinction; do not append a country automatically to every language.

TagMeaningWhen it matters
enEnglishLanguage distinction is sufficient
en-GBEnglish as used in the United KingdomRegional spelling or formatting differs
sr-Latn-RSSerbian, Latin script, SerbiaScript and region are relevant
ar-EG-u-nu-arabArabic, Egypt, Arabic numbering systemA Unicode locale preference is requested

Treat tags case-insensitively, canonicalize them with a standards- aware library or platform API, and preserve an explicit fallback chain. Language choice must not be used as a proxy for nationality.

ITU-T E.164: globally interoperable telephone numbers

E.164 defines the international public telecommunication numbering framework, including country calling codes and a maximum of 15 digits for the international number. A leading + is the conventional signal that the following digits are in international form; it is not part of the 15 digits.

type PhoneRecord = {
  e164: string;          // canonical interchange, for example +442079460018
  rawInput: string;      // optional audit/support value
  regionAtEntry: string; // ISO 3166-1 alpha-2 parsing context
  metadataVersion: string;
};

// Parsing requires numbering-plan metadata.
// A valid shape does not prove assignment, ownership, or reachability.
// Confirm reachability separately with an OTP/call when the workflow requires it.

Country calling codes are not ISO country codes and are not always one-to-one with countries. National trunk prefixes and display spacing are also separate from the canonical international value.

UPU S42: international postal address components

UPU S42 models postal-address components and country-specific templates. Address lines do not have one universal order: recipient, premise, thoroughfare, locality, administrative area, and postcode appear differently across postal systems and scripts.

  • Store structured components plus the original user-entered representation when appropriate.
  • Render according to destination-country rules rather than the interface language.
  • Do not require a state, postcode, house number, or Latin transliteration in every market.
  • Separate syntactic validation, postal recognition, geocoding, and deliverability.
  • Version country templates and provider datasets because postal rules change.

A safe cross-standard record

Name fields by the standard they contain. This prevents downstream code from silently interpreting a language as a country or a country as a currency.

{
  "countryCode": "GB",
  "countryCodeStandard": "ISO 3166-1 alpha-2",
  "subdivisionCode": "GB-SCT",
  "languageTag": "en-GB",
  "languageTagStandard": "BCP 47",
  "currencyCode": "GBP",
  "currencyCodeStandard": "ISO 4217",
  "phoneE164": "+441316496500",
  "addressTemplateStandard": "UPU S42",
  "dataVersion": "2026-08-02"
}

Implementation rules

  1. Store stable identifiers separately from translated display names.
  2. Record the source, edition, or dataset release used to validate each domain.
  3. Do not invent joins between standards; maintain reviewed mapping tables.
  4. Allow for deprecation and historical records instead of overwriting old meaning.
  5. Validate syntax and membership, then run separate operational checks where needed.
  6. Use official maintenance sources for updates and test migrations against existing data.

Primary and official sources