`en_US.utf8`の` utf8`は正規の文字セットですか?

Aug 23 2020

の出力はlocale大文字と小文字を区別しているようです。

% locale -a 
C
en_AU.utf8
en_US.utf8
POSIX

より一般的には、ハイフンで大文字になっているのを見てきましたUTF-8

utf8 / UTF-8の正規名は何ですか?

回答

3 TomHale Aug 22 2020 at 23:43

TL; DR:いいえ。

  • utf8IANA文字セットは-文字を削除するため、参照しません。
  • IANA文字セット名ケースですIN敏感。
  • したがって、以下はすべてRFC3629を参照しています。UTF-8、ISO10646の変換形式:
    • UTF-8
    • utf-8
    • uTf-8 (すべてハイフンがあることに注意してください)
  • 上記の名前の大文字と小文字を区別するエイリアスがあります:csUTF8

詳細

POSIX.1-2017、セクション8.2国際化変数

ロケール値の形式が次の場合:

language[_territory][.codeset]

これは、言語、地域、およびコードセットの設定が実装によって定義されている、実装によって提供されるロケールを指します。

しかし、POSIX.1は詳細の実装を定義したままですが、IANAはそれについて何か言いたいことがあります。

RFC2978IANA文字セット登録手順

2.3。命名要件は、文字セットのプライマリ名を定義します。

 mime-charset = 1*mime-charset-chars
 mime-charset-chars = ALPHA / DIGIT /
            "!" / "#" / "$" / "%" / "&" /
            "'" / "+" / "-" / "^" / "_" /
            "`" / "{" / "}" / "~"
 ALPHA        = "A".."Z"    ; Case insensitive ASCII Letter
 DIGIT        = "0".."9"    ; Numeric digit

に注意してくださいCase insensitive ASCII Letter

興味深いことに、これはそれ^-^が幸せですが有効な文字セット名であることを意味します。

IANA文字セット

これらは、インターネットで使用される可能性のある文字セットの正式な名前であり、インターネットのドキュメントで参照される場合があります。

文字セット名は、US-ASCIIの印刷可能な文字から取得した最大40文字です。ただし、大文字と小文字の使用は区別されません。[私の強調]

IANAは、文字セットをとしてリストしますUTF-8

一方でutf-8(またはuTf-8IANAの文字セット名の正式名称である)、 utf8(サンセリフハイフン)は、IANAの文字セット名ではありません。

!大文字と小文字を区別する!もあることに注意してください。エイリアスのための名前のUTF-8、すなわち:csUTF8

「cs」は文字セットを表し、小文字の最初の文字が必要であるが、その後はアンダーバー( "_")やダッシュ( "-")などの特殊文字を含めることができない混合大文字を使用するアプリケーションに提供されます。

IANAでない場合、どこutf8から来る可能性がありますか?

glibc_nl_normalize_codeset()は次のことを行います。

  • 文字または数字のみを渡します(さようならハイフン)

  • 文字を小文字に変換します

    for (cnt = 0; cnt < name_len; ++cnt)
      if (__isalpha_l ((unsigned char) codeset[cnt], locale))
        *wp++ = __tolower_l ((unsigned char) codeset[cnt], locale);
      else if (__isdigit_l ((unsigned char) codeset[cnt], locale))
        *wp++ = codeset[cnt];
    

コードコメントは誤って言っています:

コードセット名の標準はありません。

このコメントは、RFC2978IANA文字セット登録手順2.3を認識していないようです。命名要件。