用PHP检测服务器区域编码


Detecting server locale encoding with PHP

我使用setlocalestrftime在巴西葡萄牙语中显示本地化的月份名称:

setlocale(LC_ALL, 'pt_BR');
$meses = array();
for($m=1; $m<=12; $m++) {
    $meses[$m] = strftime('%B', mktime(0, 0, 0, $m, 1));
}

这在我的开发环境中工作得很好,但在生产服务器上,它在三月(葡萄牙语是"maro")失败了。如果我utf8_encode月份名称,它在服务器上工作,但在我的开发环境中,我得到双编码输出。我怀疑这是因为每台机器上的语言环境编码不同。我想正确的解决方案是在服务器上为pt_BR安装UTF8区域设置,但我想避免这种情况,如果可能的话(长话短说,服务器管理员,嗯,困难)。

是否有可能从PHP检测当前语言环境的编码,因此我可以围绕这个问题进行编码,并使我的代码工作,而不管语言环境/编码设置?

使用

echo setlocale(LC_CTYPE, 0); // en_US.UTF-8

获取当前编码,然后绕过它。

将0传递给setLocale将获得区域设置值。在本例中,我们将获得LC_CTYPE设置的值。

在问题下面的评论中我们可以解决这个问题。这是因为两个系统上的语言环境名称不同,一个使用pt_BR.uft-8,另一个使用pt_BR.UTF8

最后我们同意在配置文件中定义区域设置并使用它。

使用

获取strftime使用的编码
 mb_internal_encoding()

将stftime编码的字符串转换为utf-8,使用

mb_convert_encoding(strftime($format, $timestamp), 'UTF-8', mb_internal_encoding());