質問: UNIX 環境変数 `LC_***` 系に設定する値は RFC3066 というか RFC4646 にほぼ基づいているようですが、微妙に差異があるようです。 - 区切りコード: 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 に使う場合の最適記法を教えてください。
回答: 部分回答ですが... `LC_*`および`LANG`が取る値の共通形式はPOSIX(IEEE Std 1003.1)で定義されていて、次のとおりです (@modifierは`LANG`以外)。他の形式は実装依存です。 *language*[_*territory*][.*codeset*][@*modifier*] *language*と*territory*は慣習的にはそれぞれISO 639-1とISO 3166-1が使われてますし、個別の実装のマニュアルでも大抵そう記してあるんですが(例)、POSIXドキュメント内での明確な言及は見つけられませんでした。RFCの方は明確な言及がありますね。 なお、RFC4646はobsoletedで、最新はRFC5646じゃないかな。 * Q1: 歴史的になぜ差が生じたかはわかりません。規格的には、Unixの環境変数は準拠する規格が違うから、ということになります。アンダースコアのかわりにハイフンでも良し、とするのは実装の拡張だと思います。 * Q2: 環境変数に使う場合はPOSIXどおり、アンダースコアを使うのが無難だと思います。大文字小文字についてはPOSIX内に定義がなく、ISOでは*language*を小文字、*territory*を大文字、が推奨されていますが、POSIX内の例では*language*の最初を大文字にしているんですよね。 * Q3: URIに使う、というのは特定のschemeで定義されてるのでない限りは作成者の自由でしょう。ただ、多くの場面でlanguage tagとして使う場合はRFCの形式の方を使うでしょうから、RFCに合わせておくのが無難じゃないかなと思います。