【问题标题】:Git Hook - PHP Script - charset issueGit Hook - PHP 脚本 - 字符集问题
【发布时间】: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.
--------------------------

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 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 转储所有环境变量及其值到每个脚本中的文件,然后在运行两个挂钩后比较结果。尤其要查找名为 LANGLC_*LC_MESSAGES 等)的变量——更多信息 here
  • @kostix 即使我直接在文件中将代码前面的LANG/LANGUAGE/LC_ALL 明确设置为en_US.UTF8,问题仍然存在。

标签: php git encoding locale githooks


【解决方案1】:

尚无解决方案,但可以在 Windows 上设置区域设置

在我的情况下是 Win 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 ); 返回的相同本地。您不要弄乱用户系统。重置为原始状态 - 让您的房子保持清洁。

【讨论】:

    【解决方案2】:

    我发现,出于某种原因(在 Windows 7 上),git hook 不可能超出 ASCII 128 字符表。

    再次重申:没有解释,只是因为这是受支持的范围,可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多