en_US.utf8 和 en_US.UTF-8 之间有区别吗?

Mat*_*bst 5 php localization charset utf-8 encoding

服务器信息(删除了 DNS 和 IP):

cat /proc/version && uname -a && java -version

Linux version 2.6.16.33-xenU (*************) (gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)) #2 SMP Wed Aug 15 17:27:36 SAST 2007
Linux ************* *************-xenU #2 SMP Wed Aug 15 17:27:36 SAST 2007 x86_64 x86_64 x86_64 GNU/Linux
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
Run Code Online (Sandbox Code Playgroud)

我有一些 PHP 代码正在读取 Excel 文件并进行字符串比较。由于似乎是语言环境问题,它在服务器上失败。然而,在我的本地机器(OSX 10.8.5 Mountain Lion)上,它可以工作!

在我的本地机器上,语言环境是 en_US.UTF-8。在服务器上,语言环境是 POSIX,但我将其更改为 en_US.utf8,因为当我查看locale -a时没有 en_US.UTF-8 (有趣的是,服务器上的语言环境列表都是小写的,但在我的 Mac 上它们都是大写,这就是这个问题的来源)。

两者之间是否存在可能影响字符串比较的差异?

另外,根据这篇 SF 帖子,我运行了locale -v -a。在服务器上,en-US.utf8 使用 UTF-8 代码集(我假设这与我通常所说的字符集相同?)。但是,在我的本地机器上,我似乎无法运行locale -v -a命令,尽管localelocale -a工作正常。

编辑: 我在 StackOverflow 上问的一个相关问题。

Tom*_*ale 8

特尔;博士:

代码页/字符集.utf8en_US.utf8没有正式据我可以告诉认可。没有 IANAutf8字符集名称utf8可能是由glibc-产生的- 见最终标题。

IANA 字符集名称是UTF-8.

  • 连字符很重要
  • 案例是敏感

因此,这些都是有效的:

  • en_US.utf-8
  • en_US.UTF-8
  • en_US.uTf-8

还有一个!区分大小写!别名名称 UTF-8,即:csUTF8

因此,这也是有效的:

en_US.csUTF8
Run Code Online (Sandbox Code Playgroud)

但我从未在野外见过这种情况。

详细信息,带章节和诗句

UTF-8是有效的 IANA 字符集名称,而utf8不是。它甚至不是一个有效的alias

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

如果 locale 值具有以下形式:

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

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

这里有问题的[.codeset]部分是 POSIX 没有定义但 IANA 定义的部分。

对于 RFC2978: 定义的字符集UTF-8, a transformation format of ISO 10646IANA 字符集名称列为:

UTF-8

顶部的注释说:

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

提供了一个别名 csUTF8RFC2978 IANA Charset Registration Procedures, section 2.3说:

所有其他名称都被视为主要名称的别名,并且首选使用主要名称而不是使用任何别名。

IANA 字符集还说:

“cs”代表字符集,提供给需要小写首字母但之后想使用混合大小写的应用程序,不能包含任何特殊字符,例如下划线(“_”)和破折号(“-”)。

cs别名中,大小写很重要(而名称在上面定义为不区分大小写)。

鉴于 alias csUTF8,en_US.csUTF8也将是有效的,但我从未在野外见过这种格式。

虽然大小写在aliases 中很重要,但关于namesIANA Character Sets说:

字符集名称最多可包含 40 个字符,取自 US-ASCII 的可打印字符。但是,不区分大小写字母的使用。

因此,虽然en_US.utf-8有效(列出的 的小写版本UTF-8),en_US.utf8但在删除-.

如果不是 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)