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命令,尽管locale和locale -a工作正常。
代码页/字符集.utf8在en_US.utf8没有正式据我可以告诉认可。没有 IANAutf8字符集名称。utf8可能是由glibc-产生的- 见最终标题。
IANA 字符集名称是UTF-8.
因此,这些都是有效的:
en_US.utf-8en_US.UTF-8en_US.uTf-8还有一个!区分大小写!别名的名称 UTF-8,即:csUTF8。
因此,这也是有效的:
en_US.csUTF8
Run Code Online (Sandbox Code Playgroud)
但我从未在野外见过这种情况。
UTF-8是有效的 IANA 字符集名称,而utf8不是。它甚至不是一个有效的alias。
如果 locale 值具有以下形式:
Run Code Online (Sandbox Code Playgroud)language[_territory][.codeset]它指的是实现提供的语言环境,其中语言、地区和代码集的设置是实现定义的。
这里有问题的[.codeset]部分是 POSIX 没有定义但 IANA 定义的部分。
对于 RFC2978: 定义的字符集UTF-8, a transformation format of ISO 10646,
IANA 字符集将名称列为:
UTF-8
顶部的注释说:
这些是可能在 Internet 中使用并且可能在 Internet 文档中引用的字符集的正式名称。
提供了一个别名 csUTF8,RFC2978 IANA Charset Registration Procedures, section 2.3说:
所有其他名称都被视为主要名称的别名,并且首选使用主要名称而不是使用任何别名。
IANA 字符集还说:
“cs”代表字符集,提供给需要小写首字母但之后想使用混合大小写的应用程序,不能包含任何特殊字符,例如下划线(“_”)和破折号(“-”)。
在cs别名中,大小写很重要(而名称在上面定义为不区分大小写)。
鉴于 alias csUTF8,en_US.csUTF8也将是有效的,但我从未在野外见过这种格式。
虽然大小写在aliases 中很重要,但关于names,IANA Character Sets说:
字符集名称最多可包含 40 个字符,取自 US-ASCII 的可打印字符。但是,不区分大小写字母的使用。
因此,虽然en_US.utf-8有效(列出的 的小写版本UTF-8),en_US.utf8但在删除-.
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)
| 归档时间: |
|
| 查看次数: |
2725 次 |
| 最近记录: |