`en_US.utf8` 中的 `utf8` 是规范字符集吗?

Tom*_*ale 7 unicode locale

的输出locale似乎区分大小写:

% locale -a 
C
en_AU.utf8
en_US.utf8
POSIX
Run Code Online (Sandbox Code Playgroud)

更常见的是,我见过连字符和大写UTF-8

utf8 / UTF-8 的规范名称是什么?

Tom*_*ale 4

TL;DR:不。

  • utf8不引用 IANA 字符集,因为它会删除该-字符。
  • IANA 字符集名称区分大小写
  • 因此,以下均参考RFC3629: UTF-8,ISO 10646 的一种转换格式
    • UTF-8
    • utf-8
    • uTf-8(注意全部都有连字符)
  • 上述名称有一个区分大小写的别名csUTF8

细节

POSIX.1-2017,第8.2 节国际化变量

如果区域设置值的形式为:

language[_territory][.codeset]
Run Code Online (Sandbox Code Playgroud)

它指的是实现提供的语言环境,其中语言、区域和代码集的设置是实现定义的。

但是,虽然 POSIX.1 保留了定义的详细实现,但 IANA 对此有话要说。

RFC2978 IANA 字符集注册程序

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
Run Code Online (Sandbox Code Playgroud)

请注意Case insensitive ASCII Letter.

有趣的是,这意味着这^-^是一个愉快但有效的字符集名称。

IANA 字符集

这些是可在 Internet 中使用并且可在 Internet 文档中引用的字符集的官方名称。

字符集名称最多可以有 40 个字符,取自 US-ASCII 的可打印字符。然而,大小写字母的使用没有区别。[强调我的]

IANA 将字符集列为UTF-8.

utf-8(或)uTf-8是 IANA 字符集名称的正式名称,而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];
    
    Run Code Online (Sandbox Code Playgroud)

代码注释错误地说:

代码集名称没有标准。

此评论似乎没有意识到RFC2978 IANA 字符集注册程序 2.3。命名要求