使用PHP检测服务器区域设置编码

时间:2013-04-23 19:16:51

标签: php character-encoding localization locale

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

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

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

是否可以从PHP检测当前语言环境的编码,因此我可以围绕此问题进行编码,并使我的代码无论语言环境/编码设置如何都能正常工作?

3 个答案:

答案 0 :(得分:3)

使用

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

获取当前编码,然后解决它。

将零传递给setLocale会给出区域设置值。在这种情况下,我们将获得LC_CTYPE设置的值。

答案 1 :(得分:1)

在下面的评论中,我们可以解决问题。造成这种情况的原因是两个系统上的区域设置名称不同pt_BR.uft-8另一个pt_BR.UTF8

最后,我们同意在配置文件中定义语言环境并使用它。

答案 2 :(得分:-1)

要获取strftime使用的编码

 mb_internal_encoding()

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

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