見出し画像

世界向けサービスを提供するために必要な標準規格 ISO を理解する

この記事は、NAVITIME JAPAN Advent Calendar 2020、3日目の記事です。

こんにちは、ロクです。ナビタイムジャパンで社内APIの開発を担当しています。
今回は弊社で提供しているNAVITIMEアプリや NAVITIME Transit に利用した国際規格 ISO、およびサービス開発に利用した国・行政区画・言語・通貨を表す ISO の説明と利用例について説明します。
ISO を活用することで、表記方法に揺れが起こりうる単位や情報に対して表記を揃えることができ、データ毎の差異や開発者間の認識齟齬を防ぐことができます。

ISO を使う理由

そもそも、何故 ISO を使う必要があるのでしょうか。例えば、下記の情報を全ての人に伝える表し方を考えます。

東アジアに位置し、日本列島および南西諸島・伊豆諸島・小笠原諸島からなる領土を持ち、首都を東京都に置く国

恐らく、この記事を読まれている方の多くは「日本」と答えられるかと思います。しかし、「日本」が何を表すかを理解するには、日本語を読むスキルが必要になるため、この回答では「全ての人に伝える」という条件を満たすことができません。

英語では Japan、韓国語では일본、イタリア語では Giappone、フランス語では Japon とそれぞれ表すことができますが、これも日本語と同様にそれぞれの言語を読むスキルが必要になってしまいます。

ここで必要になるのが世界中で利用できる標準規格 ISO になります。
ISO (International Organization for Standardization) は元々、世界共通で利用できる標準規格を定める団体のことなのですが、そこから転じて世界標準規格のことを指すようになりました。

今回の場合では、国やそれに準ずる地域を表す標準規格 ISO 3166 を利用することで、この国は「JP」「JPN」「392」と表すことができます。
どこにいる人でも、どんな言葉を話している人にも、これを理解することで共通の物事を指し示すことが出来る規格、それが ISO なのです。

国を表す ISO

上述の通り、標準規格 ISO 3166 で国を表すことができました。この規格は通称国コード、国名コードと呼ばれています。この規格は更に細かく分かれているのですが、本項では2文字のアルファベットで表す規格 ISO 3166-1 alpha-2 を利用します。
この規格で表されるコードは、国別のトップレベルドメインとほぼ同じになります(一部例外あり)。これらは見覚えがあるものかもしれません。

日本の国コードは JP、トップレベルドメインは jp
ツバルの国コードは TV、トップレベルドメインは tv
イギリスの国コードは GB、ただしトップレベルドメインは uk

この国コードは、地点情報に紐付けることで「この地点はどの国にあるか」を手軽に表すことができます。アメリカであれば US、中国であれば CN、フランスであれば FR といった具合ですね。

// 地点情報に国コードを紐付けた場合
{
  "name": "フロリダ・ウォルト・ディズニー・ワールド・リゾート",
  "country": "US"
},
{
  "name": "上海ディズニーリゾート",
  "country": "CN"
},
{
  "name": "ディズニーランド・パリ",
  "country": "FR"
}

基本的に1つの国に対しては1つの国コードが結びつきますが、特定の地域では国コードだけではなく、後述の行政区画コードも指定できる場合があります。

行政区画を表す ISO

日本では都道府県、アメリカでは州というように、国の次に細分化出来る単位のことを行政区画と呼びます。
行政区画は ISO 3166-2 で規格化されており、国コードとその国の行政区画を表す 1 〜 3 文字の英数字をハイフンで繋ぐ形式となっています。本項では便宜上、行政区画コードと呼びます。
例えば、日本の東京都であれば JP-13、アメリカのニューヨークであれば US-NY と表すことができます。

// 東京(JP-13)にある自由の女神像とニューヨーク(US-NY)にある自由の女神像を表す場合
{
  "name": "自由の女神像",
  "country": "JP",
  "division": "JP-13"
},
{
  "name": "自由の女神像",
  "country": "US",
  "division": "US-NY"
}

また、前述の国コードと行政区画コード両方で表すことのできる地域の一つにグアムが該当します。
グアムには国コード GU が与えられていますが、アメリカの準州であることから US-GU という行政区画コードも与えられています。

言語を表す ISO

国や行政区画を表す規格があれば、言語を表す標準規格も存在します。言語は ISO 639-1 で規格化されており、通称言語コードと呼ばれています。
日本語であれば ja、英語であれば en、韓国語であれば ko と表すことができます。

// 例:表参道の名称を日本語(ja)、英語(en)、韓国語(ko)で表す場合
{
  "name": {
    "ja": "表参道",
    "en": "Omote-sando",
    "ko": "오모테산도"
  }
}

また、言語コードを拡張する規格として「同じ言語でもどの地方で話されているか」という補助情報を付与する RFC 4646 が存在します。この規格では、言語コードと国コードをハイフンで繋ぐ形式で表します。
この規格を利用すると、同じ言葉でも地方により字体が異なる中国語 zh は、主に中国で利用されている簡体字を zh-CN、主に台湾で利用されている繁体字を zh-TW と表すことができます。

// 例:東京タワーの名称を日本語(ja)、簡体字(zh-CN)、繁体字(zh-TW)で表す場合
{
  "name": {
    "ja": "東京タワー",
    "zh-CN": "东京塔",
    "zh-TW": "東京鐵塔"
  }
}

アメリカ英語とイギリス英語の違いはそれぞれ、en-US, en-GB と表すこともできます。

// 例:ある文章をアメリカ英語(en-US)、イギリス英語(en-GB)で表す場合
{
  "text": {
    "en-US": "Let's take a break.",
    "en-GB": "Let's have a break."
  }
}

一部の言語は、言語コードが複数に分かれているため、注意が必要になります。ノルウェー語には言語コード no がありますが、実際のノルウェー語はブークモール nb とニーノシュク nn の2種類に分かれているからです。
ノルウェー国内では一般的にブークモールが広く利用されているものの、公的機関ではニーノシュクも等しく利用されているため、データとして持つ場合は no ではなく、nb と nn のどちらかが分かるようにデータを作成する必要があります。

// 例:オスロ空港を日本語(ja)とブークモール(nb)で表す場合
{
  "name": {
    "ja": "オスロ空港",
    "nb": "Oslo lufthavn"
  }
}

通貨を表す ISO

国ごとに異なる通貨にも、標準規格 ISO 4217 が存在します。これは通称通貨コードと呼ばれます。日本円であれば JPY、米ドルであれば USD というように、国コード2文字に通貨単位を表した1文字を加えた3文字で表すのが一般的です。為替レートで見たことのある方も多いかと思います。

通貨コードには通貨番号が割り振られており、この値は3桁の数字で国を表す ISO 3166-1 numeric と同じになります。国に対して、通貨単位はデノミネーションの実施等で変わる可能性があるため、通貨コードを取得する際は通貨番号を基準にする場合があります。

/** 
 * 例:Java で通貨番号から通貨コードを取得するメソッド
 * @param numeric 通貨番号
 * @return 通貨コード
 */
public static Optional<String> findCurrencyCode(int numeric) {
  return Currency.getAvailableCurrencies().stream()
				.filter(currency -> currency.getNumericCode() == numeric)
				.findFirst()
                .map(Currency::getCurrencyCode);
}

通貨コードや通貨番号以外にも、ISO 4217 には、通貨と補助通貨の関係を 10 の指数で表す exponent という仕組みが存在します。米ドルであればセント、英ポンドであればペニーのように通貨を細かく分けたものを補助通貨と呼ぶのですが、セントやペニーは通貨の100倍であるため、exponent は共に 2 となります。
日本では株取引等で補助通貨の銭が利用されていますが、一般には利用されないため、exponent は 0 です。
レアケースとして、補助通貨が 5 倍になるマダカスカルのアリアリやモーリタニアのウギアでは、exponent を 2、金額を 0.2, 0.4... と表しています。

// 例:ニューヨーク地下鉄の運賃を表す場合
{
  "fare": 2.75,
  "currency": {
    "code": "USD",
    "exponent": 2
  }
}

また、国によっては国内取引で複数の通貨を利用している場合があります。カンボジアの場合、リエルという通貨が存在するのですが、国内では信頼性が高くないようで、取引には主に米ドルが利用されているようです。国ごとの事情も把握してサービスの開発を進める必要があります。

ISO まとめ

世界に向けてのサービスを提供するために利用した ISO をまとめました。ISO を利用することで、サービス開発での齟齬をなくして実装を進めることができました。また、ISO に沿ったデータ作成を行うことで容易にサービスを提供する国を追加することが可能になるはずです。

今後、世界へ向けてのサービスを開発する場合の一助になれば幸いです。


この記事が参加している募集

#とは

57,772件