「ロケール」の文字列表現を整理してみた

Linuxの環境変数LANGやHTMLのlang属性、PHPのsetlocaleなど、様々な所でロケールを指定できますが、以下の様にバリエーションがあり、混乱したので仕様を整理してみました。

  • ja
  • jp
  • ja-jp (ハイフン区切り)
  • ja_jp (アンスコ区切り)

(どれが正解なんだ・・・?)

ロケールとは?

ロケールとは、(物語の)舞台、現場、場所などの意味を持つ英単語で、ITの分野ではシステムやソフトウェアにおける言語や国・地域の設定のことをこのように呼ぶ。

http://e-words.jp/w/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB.html

ロケール表現の構成要素

よく登場するのは以下2つの仕様です。

  • ISO 639
    • 言語を表すコード
    • ドキュメントはこちら
    • 例)日本語ならja、英語ならen
  • ISO 3611
    • を表すコード
    • WIkiに一覧がある
    • 例)日本ならJP、米国ならUS、英国ならGB

これらを組み合わせてロケールを表現します。
調べた所、以下2つがよく使われるロケール表現のようです。

①ANSI Cのロケール表現

ANSI C(C言語の標準)のロケールを表す文字列です。
以下の書式でロケールを表現します。

language_territory.codeset@modifier
  • language
    • 言語(ISO 639に準拠)
  • territory
    • 地域(ISO 3166に準拠)
  • codeset
    • 文字コード
  • modifier
    • 修飾子

構成要素として前述の言語コード、国コードが使われています。
例えば日本語&日本&UTF-8だとja_JP.utf8となる。
詳しくはこちらを参照

②IETF言語タグ(IETF language tag)

BCP47(RFC 5646とRFC 4647)で定義されているロケールを表す文字列です。
過去のバージョンとしてRFC1766とRFC 3066があります。
書式は以下の通り。
(正確にはもう少し長いのですが、将来の予約領域など、現在はほとんど使われていない様なので省略しました)

language-script-region
  • language
    • 言語(ISO639に準拠)
    • jaenなど
  • script
    • 文字体系(ISO 15924に準拠)
  • region
    • 地域(ISO 3166-1 alpha-2、UN M.49に準拠)
    • jpUSなど

例えば日本語&日本だとja-jpとなります。
ANSI Cのロケール表現はアンスコ区切りでしたが、こちらはハイフン区切りになります。
また、文字コードもありません。

詳しくはWiki参照

ロケール表現の使い分け

ロケールを指定する箇所はいくつかあるので、それぞれどちらの仕様に準拠するのか調べました。

  • Linuxの環境変数LANG
    • ANSI C
  • HTMLのLang属性
    • IETF言語タグ
  • PHPのsetLocale関数
    • システム依存(つまりLinuxの場合はANSI C準拠?)
  • Laravelのロケール
    • config/app.phpのlacaleの事。
    • 恐らくどちらでもなくLaravel独自のロケール表現
    • Laravel-Langではアンスコ区切りになっているが、ANSI Cに従っている訳でもない。

おわりに

自信持ってLANGを設定していこうな

コメントする