我正在使用setlocale
和strftime
以巴西葡萄牙语显示本地化的月份名称:
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检测当前语言环境的编码,因此我可以围绕此问题进行编码,并使我的代码无论语言环境/编码设置如何都能正常工作?
答案 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());