PHP setlocale存在但是错了

时间:2015-04-08 18:04:33

标签: php windows wamp setlocale

我试图在我的应用程序中设置pt_BR语言环境。

但是,出于某种原因,我的数字格式配置仍然是错误的格式。

我尝试在很多方面设置正确的语言环境:

setlocale(LC_ALL, 'pt_BR');
setlocale(LC_ALL, 'pt_BR.utf-8', 'pt_BR', 'portuguese', 'pt-br');
setlocale(LC_ALL, 'pt_BR.utf-8');
setlocale(LC_ALL, 'portuguese');

但是,对于所有这些,我有一个带点的decimal_point。葡萄牙语中的正确值是逗号。它的结果完全相同:

array (size=18)
  'decimal_point' => string '.' (length=1)
  'thousands_sep' => string '' (length=0)
  'int_curr_symbol' => string '' (length=0)
  'currency_symbol' => string '' (length=0)
  'mon_decimal_point' => string '' (length=0)
  'mon_thousands_sep' => string '' (length=0)
  'positive_sign' => string '' (length=0)
  'negative_sign' => string '' (length=0)
  'int_frac_digits' => int 127
  'frac_digits' => int 127
  'p_cs_precedes' => int 127
  'p_sep_by_space' => int 127
  'n_cs_precedes' => int 127
  'n_sep_by_space' => int 127
  'p_sign_posn' => int 127
  'n_sign_posn' => int 127
  'grouping' => 
    array (size=0)
      empty
  'mon_grouping' => 
    array (size=0)
      empty

这发生在我测试的本地环境和其他一些Windows计算机上。但在另一个Windows中它可以工作。所有运行Windows 7的计算机。 我还在UNIX环境中进行了测试并且运行良好。问题仅适用于某些Windows安装。

语言环境存在但出于某种原因是错误的。

有人有想法帮助我吗? 我想了解为什么会这样。

由于

1 个答案:

答案 0 :(得分:1)

Windows和unix使用不同的区域设置代码。某些区域设置也可能未安装在系统上。这使得setlocale功能不易移植。

setlocale手册警告可能的失败原因:

  

返回新的当前语言环境,如果是语言环境功能,则返回FALSE   未在您的平台上实现,指定的区域设置不会   存在或类别名称无效。

您应检查返回值并尝试解决方法,以防该语言环境不可用。

<强>更新

关于您的问题,当setlocale调用成功但对区域设置没有影响时,我发现此bug report状态为won't-fix。在bug评论中,函数通常被描述为不可预测的。失败的可能原因之一是它不是线程安全的。还有另一个类似的bug report标记为重复。有趣的是,两位记者都将Windows 7列为他们的平台。