服务器信息(已删除 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)
我有一些从 Excel 文件中读取并进行字符串比较的 PHP 代码。由于似乎是语言环境问题,它在服务器上失败了。但是,在我的本地机器(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命令,尽管locale和locale -a工作正常。
TL;博士:
据我所知,其中的代码页/字符集并未得到官方
.utf8
认可。en_US.utf8
没有 IANAutf8
字符集名称。utf8
可能是由glibc
- 见最终标题生成的。IANA 字符集名称是
UTF-8
.因此,这些都是有效的:
en_US.utf-8
en_US.UTF-8
en_US.uTf-8
还有一个!区分大小写!名称的别名,即:。
UTF-8
csUTF8
因此,这也是有效的:
但我从未在野外见过这种情况。
细节,有章节和经文
UTF-8
是有效的 IANA 字符集名称,而utf8
不是。它甚至不是一个有效的别名。POSIX.1-2017,第8.2 节国际化变量说:
这里有问题的
[.codeset]
部分是 POSIX 没有定义的部分,但 IANA 定义了。对于 RFC2978: 定义的字符集
UTF-8, a transformation format of ISO 10646
, IANA Character Sets将名称列为:UTF-8
顶部的注释说:
提供了一个别名
csUTF8
,关于RFC2978 IANA 字符集注册程序,第 2.3 节说:IANA 字符集还说:
在
cs
别名中,大小写很重要(而名称在上面定义为不区分大小写)。给定别名
csUTF8
,en_US.csUTF8
也是有效的,但我从未在野外见过这种格式。虽然大小写在aliases中很重要,但关于names,IANA Character Sets说:
因此,虽然
en_US.utf-8
是有效的(列出的小写版本UTF-8
),en_US.utf8
但它不引用 IANA 字符集,因为它删除了-
.如果不是 IANA,它
utf8
可能来自哪里?glibc
_nl_normalize_codeset()
执行以下操作:只传递字符或数字(再见连字符)
将字符转换为小写
没有不同。他们是一样的。