32080
UNIX 環境変数 `LC_***` 系に設定する値は [RFC3066](https://www.ietf.org/rfc/rfc3066.txt)
というか [RFC4646](https://www.ietf.org/rfc/rfc4646.txt)
にほぼ基づいているようですが、微妙に差異があるようです。  
\- 区切りコード: RFC4646 では `%x2D` (ハイフン-マイナス) に対し、環境変数では `%x5F` アンダースコア  
\- RFC4646 には case insensitive とあるが、環境変数では使い分けがされているようだ

そして実際、下記のようなコマンドを入力してもエラーは出ず結果は同じでした。  
(cygwin と hpux-11.11 でチェック)

```

    $ LC_ALL=ja_JP.utf8 sort hoge.txt > piyo1.txt
    $ LC_ALL=ja-JP.utf8 sort hoge.txt > piyo2.txt
    $ LC_ALL=JA-JP.UTF8 sort hoge.txt > piyo3.txt
    $ LC_ALL=ja-jp.utf8 sort hoge.txt > piyo4.txt
    
```

Q1. この微妙な差の由来をご存知だったら教えてください。  
Q2. 環境変数に使う最適記法を教えてください。  
Q3. URI に使う場合の最適記法を教えてください。
CC BY-SA 3.0
2017-01-23T05:32:04.580
32073
2018-05-07T15:07:41.857
2018-05-07T15:07:41.857
19769
8589
question
unix
RFC4646 と UNIX 環境変数の違い
部分回答ですが…

`LC_*`および`LANG`が取る値の共通形式はPOSIX([IEEE Std
1003.1](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_02))で定義されていて、次のとおりです
(@modifierは`LANG`以外)。他の形式は実装依存です。

_language_ [_ _territory_ ][. _codeset_ ][@ _modifier_ ]

_language_ と _territory_ は慣習的にはそれぞれ[ISO
639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)と[ISO
3166-1](https://en.wikipedia.org/wiki/ISO_3166-1)が使われてますし、個別の実装のマニュアルでも大抵そう記してあるんですが([例](http://man7.org/linux/man-
pages/man3/setlocale.3.html))、POSIXドキュメント内での明確な言及は見つけられませんでした。RFCの方は明確な言及がありますね。

なお、RFC4646はobsoletedで、最新は[RFC5646](https://www.rfc-
editor.org/rfc/rfc5646)じゃないかな。

  * Q1: 歴史的になぜ差が生じたかはわかりません。規格的には、Unixの環境変数は準拠する規格が違うから、ということになります。アンダースコアのかわりにハイフンでも良し、とするのは実装の拡張だと思います。
  * Q2: 環境変数に使う場合はPOSIXどおり、アンダースコアを使うのが無難だと思います。大文字小文字についてはPOSIX内に定義がなく、ISOでは _language_ を小文字、 _territory_ を大文字、が推奨されていますが、POSIX内の例では _language_ の最初を大文字にしているんですよね。
  * Q3: URIに使う、というのは特定のschemeで定義されてるのでない限りは作成者の自由でしょう。ただ、多くの場面でlanguage tagとして使う場合はRFCの形式の方を使うでしょうから、RFCに合わせておくのが無難じゃないかなと思います。
CC BY-SA 3.0
2017-01-23T09:04:55.117
32080
2017-01-25T04:09:09.007
2021-10-07T07:34:52.683
-1
5258
32073
answer