的输出locale
似乎区分大小写:
% locale -a
C
en_AU.utf8
en_US.utf8
POSIX
更常见的是,我看到过连字符和大写的UTF-8
。
utf8 / UTF-8 的规范名称是什么?
答案1
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]
它指的是实现提供的语言环境,其中语言、区域和代码集的设置是实现定义的。
但是,虽然 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
请注意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];
代码注释错误地说:
代码集名称没有标准。
这个评论貌似不被认可RFC2978 IANA 字符集注册程序,2.3。命名要求。