我使用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));
}
这在我的开发环境中工作得很好,但在生产服务器上,它在三月(葡萄牙语是"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());