Git Hook - PHP脚本 - charset问题

时间:2014-08-07 09:59:30

标签: php git encoding locale githooks

我正在用PHP开发基于每个项目的/可移植的Git Hooks库。现在出现了一个奇怪的问题:目前pre-push挂钩有一个奇怪的问题。文件编码是UTF8没有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.
--------------------------

Goto Source

字符应该相对保存。原始(适用于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个回复中找到。 两者都可以在Packagist上使用wcm/git-php-hooks(-library)

在两个不同的钩子上运行相同文件会导致字符集差异的原因是什么?

修改

要检查CLI上的locale,我使用(以下非逻辑PHP方式通过调用setlocale() 0来获取本地 - 执行 not 使用NULL''空字符串,因为这实际上重置它。)

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

2 个答案:

答案 0 :(得分:0)

还不是解决方案,但可以在Windows上设置区域设置

在我的案例中获胜7。

在阅读Debian SVN site for setlocale.c之后,我发现除了ISO 639-2和ISO 3166之外,还有标准

  

(...)将带有ISO 639语言代码和ISO 3166国家/地区代码的表单中的名称转换为带有英文名称或带有三个字母标识符的表单。

Win32 - 我说的一切。现在我尝试了最后一件事:Debugg

setlocale( LC_ALL,
    "en_US.UTF-8",
    "en_US.UTF8",
    "en_US.utf-8",
    "en_US.utf8",
    "C",
    // This works on Win(7):
    "ENU",
    "English_United States.1252"
);

如果使用3字符代码或完整字符串,则无关紧要。结果始终是完整/长字符串。

  

重要:首先检查您的本地字符串,因为此设置看起来是永久性更改。至少我之后可以删除该设置,然后仍然有setlocale( LC_ALL, 0 );返回的相同本地。您搞乱了用户系统。重置为原始 - 保持房屋清洁。

答案 1 :(得分:0)

我发现,出于某种原因(在Windows 7上),没有可能超出ASCII 128字符表的git钩子。

再次:没有解释,只是这是支持的范围,没有问题。