setlocale(LC_CTYPE,“de_DE.UTF8”)或setlocale(LC_CTYPE,“de_DE.UTF-8”)?

问题描述 投票:6回答:4
setlocale(LC_CTYPE, "de_DE.UTF8")

要么

setlocale(LC_CTYPE, "de_DE.UTF-8")

有没有破折号?我在答案中都看到过。

php utf-8 locale
4个回答
3
投票

我运行locale -a并使用它输出的字符串。在OS X 10.9上,我得到了de_DE.UTF-8。在Debian 6上,我得到了de_DE.utf8。另一方面,dpkg-reconfigure locales使用de_DE.UTF-8。最安全的方法可能是检查setlocale的返回值,如果失败则尝试不同的变体。

也就是说,所有版本通常都应该工作:有或没有破折号,大写或小写。


2
投票

编码名称为UTF-8。

但在这种情况下,两个参数都是正确的,他们正在为您做同样的工作


0
投票

这是一个以编程方式解决它的实用解决方案。当setlocale失败时,它返回false。

if (!setlocale(LC_ALL, str_replace('utf-8', 'utf8', $locale)) 
 && !setlocale(LC_ALL, str_replace('utf8', 'utf-8', $locale))) {
   /* fail gracefully */
}
/* your locale has been set up properly

在我的情况下,一个可以在我们的Mac上工作,另一个可以在Linux CI盒子上工作,所以这个解决方案使测试都传递给它们。

顺便说一句,小心LC_ALL。为您需要的最弱范围设置区域设置。


0
投票

您实际上可以将值数组传递给setLocale()。我在OSX上开发并在Linux上运行的主机上进行测试时遇到了这个问题。所以现在我这样做:setLocale(LC_ALL, ["de.utf", "de_DE.utf", "de_DE.UTF-8", "de", "de_DE"])匹配的第一个是go。文件:https://secure.php.net/setlocale

© www.soinside.com 2019 - 2024. All rights reserved.