【发布时间】:2014-09-30 12:28:12
【问题描述】:
我正在用 PHP 开发一个基于每个项目的/可移植的 Git Hooks 库。现在出现了一个奇怪的问题:目前pre-push 挂钩有一个奇怪的问题。文件编码是 UTF8 w/o BOM,但在 Win cmd 和 (MySys)Git/GNU Bash 上的输出仍然如下:
-------------------------
Running PHP Mess Detector
Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼Ôû¼
  dev/templates/php/bar.php
  dev/templates/php/foo.php
--------------------------
ÔÖÑ All files mess free.
--------------------------
字符应该比较节省。原件(适用于 pre-commit 钩子)如下所示:
--------------------------
Running PHP Mess Detector
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
├─ √ dev/templates/php/bar.php
├─ √ dev/templates/php/foo.php
--------------------------
♥ All files mess free.
--------------------------
可以在我的Git PHP Hooks repo 和相应的Git PHP Hooks Library repo 中找到重现问题的示例文件(很容易从测试环境中删除)。 两者都可以在 Packagist 上使用wcm/git-php-hooks(-library)。
在两个不同的钩子上运行相同的文件时,可能导致字符集差异的原因是什么?
编辑
为了检查 CLI 上的 locale,我使用了(以下非逻辑 PHP 方法通过调用带有 0 值的 setlocale() 来获取本地信息 - 请不使用 @ 987654334@ 或 '' 空字符串,因为这实际上会重置它)。
print_r( explode( ";", setlocale( LC_ALL, 0 ) ) );
然后我尝试使用 setlocale() 函数设置语言环境,这似乎适用于 OSX 和 Linux 发行版(NIX 系统)。我尝试了所有UTF 的变体(规则:根据文档先胜),C 是默认值(英文)。
setlocale( LC_ALL,
"en_US.UTF-8",
"en_US.UTF8",
"en_US.utf-8",
"en_US.utf8",
"C"
);
但是一切都被忽略了,结果我得到了German_Austria.1252。
【问题讨论】:
-
我将从探索两个脚本的环境开始:将代码 sn-p 转储所有环境变量及其值到每个脚本中的文件,然后在运行两个挂钩后比较结果。尤其要查找名为
LANG和LC_*(LC_MESSAGES等)的变量——更多信息 here。 -
@kostix 即使我直接在文件中将代码前面的
LANG/LANGUAGE/LC_ALL明确设置为en_US.UTF8,问题仍然存在。
标签: php git encoding locale githooks