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
| Domain | Authority | Example identifiers | Practical use |
|---|---|---|---|
| Countries and subdivisions | ISO 3166 | GB / GBR / 826; GB-SCT | Country interchange, region selectors, subdivisions, dataset joins |
| Currencies | ISO 4217 | GBP / 826; EUR / 978 | Money records, payment APIs, reports, currency formatting |
| Languages | ISO 639 | en; eng; ar; ara | Language identity; source for many BCP 47 language subtags |
| Language preferences | BCP 47 / RFC 5646 | en-GB; sr-Latn-RS; ar-EG-u-nu-arab | Web language metadata, locale negotiation, script and region variation |
| Telephone numbers | ITU-T E.164 | +442079460018 | Globally interoperable public telephone-number representation |
| Postal addresses | UPU S42 | Country-specific address elements and templates | Model, 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.
| Tag | Meaning | When it matters |
|---|---|---|
| en | English | Language distinction is sufficient |
| en-GB | English as used in the United Kingdom | Regional spelling or formatting differs |
| sr-Latn-RS | Serbian, Latin script, Serbia | Script and region are relevant |
| ar-EG-u-nu-arab | Arabic, Egypt, Arabic numbering system | A 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
- Store stable identifiers separately from translated display names.
- Record the source, edition, or dataset release used to validate each domain.
- Do not invent joins between standards; maintain reviewed mapping tables.
- Allow for deprecation and historical records instead of overwriting old meaning.
- Validate syntax and membership, then run separate operational checks where needed.
- Use official maintenance sources for updates and test migrations against existing data.
Primary and official sources
- ISO 3166 country codes — International Organization for Standardization
- ISO 4217 currency codes — International Organization for Standardization
- ISO 639 language code — International Organization for Standardization
- RFC 5646: Tags for Identifying Languages — RFC Editor / IETF
- Recommendation E.164 — International Telecommunication Union
- Addressing solutions and UPU S42 — Universal Postal Union