setlocale

(PHP 4、PHP 5、PHP 7、PHP 8)

setlocale设置区域设置信息

描述

setlocale(int $category, string $locales, string ...$rest): string|false

备用签名(不支持命名参数)

setlocale(int $category, array $locale_array): string|false

设置区域设置信息。

警告

区域设置信息是在每个进程中维护的,而不是每个线程中维护的。如果您在多线程服务器 API 上运行 PHP,您可能会在脚本运行期间遇到区域设置突然更改的情况,尽管脚本本身从未调用过 setlocale()。 这是由于其他脚本在同一进程的不同线程中同时运行,使用 setlocale() 更改了进程范围内的区域设置。 在 Windows 上,从 PHP 7.0.5 开始,区域设置信息在每个线程中维护。

参数

category

category 是一个命名常量,指定受区域设置影响的函数的类别

locales

如果 locales 是空字符串 "",则区域设置名称将从与上述类别名称相同的环境变量的值中设置,或从 "LANG" 中设置。

如果 locales"0",则区域设置不会受到影响,只返回当前设置。

如果 locales 后跟附加参数,则尝试将每个参数设置为新区域设置,直到成功。 如果一个区域设置在不同的系统上以不同的名称被识别,或者为了提供一个可能不可用的区域设置的回退,这将很有用。

rest

可选的字符串参数,尝试设置为区域设置,直到成功。

locale_array

尝试将每个数组元素设置为新区域设置,直到成功。 如果一个区域设置在不同的系统上以不同的名称被识别,或者为了提供一个可能不可用的区域设置的回退,这将很有用。

注意:

在 Windows 上,setlocale(LC_ALL, '') 会从系统的区域/语言设置(可以通过控制面板访问)中设置区域设置名称。

返回值

返回新的当前区域设置,或如果您的平台上没有实现区域设置功能,指定的区域设置不存在,或者类别名称无效,则返回 false

无效的类别名称也会导致警告消息。 类别/区域设置名称可以在 » RFC 1766» ISO 639 中找到。 不同的系统对区域设置有不同的命名方案。

注意:

setlocale() 的返回值取决于 PHP 运行的系统。 它将返回与系统 setlocale 函数返回的内容完全相同。

示例

示例 #1 setlocale() 示例

<?php
/* 将区域设置设置为荷兰语 */
setlocale(LC_ALL, 'nl_NL');

/* 输出:vrijdag 22 december 1978 */
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));

/* 尝试德语的不同可能的区域设置名称 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
echo
"此系统上德语的优选区域设置是 '$loc_de'";
?>

示例 #2 Windows 的 setlocale() 示例

<?php
/* 将区域设置设置为荷兰语 */
setlocale(LC_ALL, 'nld_nld');

/* 输出:vrijdag 22 december 1978 */
echo strftime("%A %d %B %Y", mktime(0, 0, 0, 12, 22, 1978));

/* 尝试德语的不同可能的区域设置名称 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo
"此系统上德语的优选区域设置是 '$loc_de'";
?>

注释

提示

Windows 用户会在 Microsoft 的 MSDN 网站上找到有关 locales 字符串的有用信息。 支持的语言字符串可以在 » 语言字符串文档 中找到,支持的国家/地区字符串可以在 » 国家/地区字符串文档 中找到。

添加注释

用户贡献的注释 34 个注释

r dot nospam dot velseboer at quicknet dot nospam dot nl
21 年前
小心使用 LC_ALL 设置,因为它可能会引入一些不必要的转换。 例如,我使用过

setlocale (LC_ALL, "Dutch");

为了在页面上获取用荷兰语表示的星期几。从那一刻起(正如我很多小时后发现的),来自 MYSQL 的浮点数被解释为整数,因为荷兰语言环境需要逗号 (,) 而不是点 (.) 作为小数点前的符号。我尝试了 printf、number_format、floatval……但都无济于事。1.50 总是被打印为 1.00 :(

当我将语言环境设置为

setlocale (LC_TIME, "Dutch");

我的星期几现在正常了,浮点数也是。

我希望我能帮助一些人免于自己去解决这个问题。

Rob
russ at eatmymonkeydust dot com
12 年前
如果你正在寻找 getlocale() 函数,只需将 0(零)作为第二个参数传递给 setlocale()。

但要注意,如果你使用 LC_ALL 类别,并且某些语言环境有所不同,则会返回包含所有语言环境的字符串

<?php
echo setlocale(LC_ALL, 0);

// LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;
// LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

echo setlocale(LC_CTYPE, 0);

// en_US.UTF-8

setlocale(LC_ALL, "en_US.UTF-8");
echo
setlocale(LC_ALL, 0);

// en_US.UTF-8

?>

如果你想存储和重置语言环境,你可以这样做

<?php

$originalLocales
= explode(";", setlocale(LC_ALL, 0));
setlocale(LC_ALL, "nb_NO.utf8");

// 做点什么

foreach ($originalLocales as $localeSetting) {
if (
strpos($localeSetting, "=") !== false) {
list (
$category, $locale) = explode("=", $localeSetting);
}
else {
$category = LC_ALL;
$locale = $localeSetting;
}
setlocale($category, $locale);
}

?>

上述代码在我的机器上运行正常(Ubuntu Linux),但由于 setlocale() 函数只是封装了等效的系统调用,因此在你那里的结果可能会有所不同。
epistomai at gmail dot com
4 年前
setlocale(LC_MONETARY, 'en_US') 现在已经失效了(至少在 PHP 7.3.8 版本中)。

我改用了 'en_US.UTF-8'
Shashakhmetov Talgat
8 年前
// 修复 Windows 上俄罗斯语言环境的编码
$locale = setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');

function strftime_fix($format, $locale, $timestamp = time()){
// 修复 Windows 上的 %e
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}
// 转换
$date_str = strftime($format, $timestamp);
if (stripos($locale, "1251") !== false) {
return iconv("windows-1251","utf-8", $date_str);
} elseif (stripos($locale, "1252") !== false) {
return iconv("windows-1252","utf-8", $date_str);
} else {
return $date_str;
}
}
Kari Sderholm aka Haprog
15 年前
我花了些时间才弄清楚如何在 Ubuntu Server 上使用 Apache2 和 PHP5 正确设置芬兰语言环境。

一开始,"locale -a" 的输出是这个
C
en_US.utf8
POSIX

我不得不使用以下命令安装芬兰语言包:
"sudo apt-get install language-pack-fi-base"

现在,"locale -a" 的输出是
C
en_US.utf8
fi_FI.utf8
POSIX

安装正确的语言包后,你需要做的最后一件事是使用 "sudo apache2ctl restart" 重启 Apache。重启 Apache 后,就可以在 PHP5 中使用语言环境 "fi_FI.utf8" 了。

要在 PHP 中设置芬兰时区和语言环境,请使用以下代码:
<?php
date_default_timezone_set
('Europe/Helsinki');
setlocale(LC_ALL, array('fi_FI.UTF-8','fi_FI@euro','fi_FI','finnish'));
?>
brice/axice/be
15 年前
注意语法。
- UTF8 不带连字符 ('-')
- locale.codeset 而不是 locale-codeset。

这是新手常犯的错误,但在使用 gettext 时值得了解。

<?php
$codeset
= "UTF8"; // 注意!不带连字符 '-' 的 UTF-8

// 为了兼容 Windows(例如 xampp):对于 Linux 系统,这三行是没用的

putenv('LANG='.$lang.'.'.$codeset);
putenv('LANGUAGE='.$lang.'.'.$codeset);
bind_textdomain_codeset('mydomain', $codeset);

// 设置语言环境
bindtextdomain('mydomain', ABSPATH.'/locale/');
setlocale(LC_ALL, $lang.'.'.$codeset);
textdomain('mydomain');
?>

语言环境目录结构(例如)
locale/fr_FR/LC_MESSAGES/mydomain.mo
locale/en_US/LC_MESSAGES/mydomain.mo

ABSPATH 是语言环境目录的绝对路径

此外,在 Linux 系统上,似乎需要使用 'locale-gen' 在操作系统级别创建语言环境。
lingureanumanuel at yahoo dot com
2 年前
对于 Windows

setlocale(LC_ALL, 'Greenlandic_Greenland.1252');
将返回 false

要使其正常工作,请使用
setlocale(LC_ALL, 'Kalaallisut_Greenland.1252');
pigmeu at pigmeu dot net
19 年前
!!警告!!

"语言环境" 始终取决于服务器配置。

例如
在某些服务器上尝试使用 "pt_BR" 时,你将始终得到 false。即使使用其他语言也是如此。

语言环境字符串需要得到服务器的支持。有时,一种语言可能有多种字符集,例如 "pt_BR.utf-8" 和 "pt_BR.iso-8859-1",但并不支持 _标准_ "pt_BR"。

这个问题在 Windows 平台上也会出现。在这里,你需要调用 "portuguese" 或 "spanish" 或 "german" 或...

也许唯一能确保 setlocale() 函数调用成功的方法是
setlocale(LC_ALL, "pt_BR", "pt_BR.iso-8859-1", "pt_BR.utf-8", "portuguese", ...);

但在执行诸如日期转换或数字格式化之类的函数时,永远不要相信这一点。确保你正在做正确的事情的最佳方法是使用默认的 "en_US" 或 "en_UK",而不是调用 setlocale() 函数。或者,确保你的服务器支持你想要使用的语言,可以通过一些测试来确认。

记住:使用默认的语言环境设置是与其他应用程序(例如数据库或 RPC 服务器)进行 "通信" 的最佳方式。

[]s

Pigmeu
stepdate at gmail dot com
6 年前
如果你已安装语言环境,但仍然无法正常工作,请检查拼写:对于德语,所有注释都建议使用 "setlocale(LC_TIME, "de_DE.utf8")”,但必须使用 "setlocale(LC_TIME, "de_DE.UTF-8")"-> UTF-8 而不是 utf8。
jose dot nobile at gmail dot com
9 年前
对于抱怨 setlocale 的 Windows 用户。

setlocale 函数的语言环境参数采用以下形式
setlocale( LC_ALL, "<language>_<country>.<code_page>" );

简而言之,如果你想使用例如:es_CO.UTF-8,它必须在 Windows 中写成:Spanish_Colombia.1252

代码页 1252 是 ISO-8859-1(windows-1252 ANSI Latin 1;西欧(Windows)

Windows 使用的语言代码与 Unix 不同,例如,es_CO 变成了 es-CO 或 Spanish_Colombia,它也不支持 UTF-8 字符集,如其网站所示:https://msdn.microsoft.com/en-us/library/x99tb11d(v=vs.140).aspx

"可用的语言环境名称、语言、国家/地区代码和代码页集包括 Windows NLS API 支持的所有那些,除了每个字符需要两个字节以上的代码页,例如 UTF-7 和 UTF-8。如果提供的代码页值为 UTF-7 或 UTF-8,setlocale 将失败,并返回 NULL。"

请查看语言和代码页的更新网站

https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.140).aspx

https://msdn.microsoft.com/en-us//goglobal/bb895996

以下是一份副本,以防链接被移除

南非荷兰语
阿尔巴尼亚语
阿拉伯语_沙特阿拉伯
阿拉伯语_伊拉克
阿拉伯语_埃及
阿拉伯语_利比亚
阿拉伯语_阿尔及利亚
阿拉伯语_摩洛哥
阿拉伯语_突尼斯
阿拉伯语_阿曼
阿拉伯语_也门
阿拉伯语_叙利亚
阿拉伯语_约旦
阿拉伯语_黎巴嫩
阿拉伯语_科威特
阿拉伯语_阿联酋
阿拉伯语_巴林
阿拉伯语_卡塔尔
亚美尼亚语
阿塞拜疆语_拉丁
阿塞拜疆语_西里尔
巴斯克语
白俄罗斯语
孟加拉语_印度
波斯尼亚语_拉丁
保加利亚语
加泰罗尼亚语
中文_台湾
中文_中国
中文_香港
中文_新加坡
中文_澳门
克罗地亚语
克罗地亚语_波斯尼亚和黑塞哥维那
捷克语
丹麦语
迪维希语
荷兰语_标准
荷兰语_比利时
英语_美国
英语_英国
英语_澳大利亚
英语_加拿大
英语_新西兰
英语_爱尔兰
英语_南非
英语_牙买加
英语_加勒比
英语_伯利兹
英语_特立尼达
英语_津巴布韦
英语_菲律宾
爱沙尼亚语
法罗语
波斯语
芬兰语
法语_标准
法语_比利时
法语_加拿大
法语_瑞士
法语_卢森堡
法语_摩纳哥
格鲁吉亚语
加利西亚语
德语_标准
德语_瑞士
德语_奥地利
德语_卢森堡
德语_列支敦士登
希腊语
古吉拉特语
希伯来语
印地语
匈牙利语
冰岛语
印尼语
意大利语_标准
意大利语_瑞士
日语
卡纳达语
哈萨克语
孔卡尼语
朝鲜语
吉尔吉斯语
拉脱维亚语
立陶宛语
马其顿语
马来语_马来西亚
马来语_文莱达鲁萨兰国
马拉雅拉姆语
马耳他语
毛利语
马拉地语
蒙古语
挪威语 (博克马尔)
挪威语 (新挪威语)
波兰语
巴西葡萄牙语
葡萄牙语 (标准)
旁遮普语
玻利维亚克丘亚语
厄瓜多尔克丘亚语
秘鲁克丘亚语
罗马尼亚语
俄语
伊纳里萨米语
挪威卢勒萨米语
瑞典卢勒萨米语
芬兰北部萨米语
挪威北部萨米语
瑞典北部萨米语
斯科尔特萨米语
挪威南部萨米语
瑞典南部萨米语
梵语
塞尔维亚语 (拉丁)
波斯尼亚和黑塞哥维那塞尔维亚语 (拉丁)
塞尔维亚语 (西里尔)
波斯尼亚和黑塞哥维那塞尔维亚语 (西里尔)
斯洛伐克语
斯洛文尼亚语
西班牙语 (传统排序)
墨西哥西班牙语
西班牙语 (现代排序)
危地马拉西班牙语
哥斯达黎加西班牙语
巴拿马西班牙语
多米尼加共和国西班牙语
委内瑞拉西班牙语
哥伦比亚西班牙语
秘鲁西班牙语
阿根廷西班牙语
厄瓜多尔西班牙语
智利西班牙语
乌拉圭西班牙语
巴拉圭西班牙语
玻利维亚西班牙语
萨尔瓦多西班牙语
洪都拉斯西班牙语
尼加拉瓜西班牙语
波多黎各西班牙语
斯瓦希里语
瑞典语
芬兰瑞典语
叙利亚语
泰米尔语
鞑靼语
泰卢固语
泰语
茨瓦纳语
乌克兰语
土耳其语
乌克兰语
乌尔都语
乌兹别克语 (拉丁)
乌兹别克语 (西里尔)
越南语
威尔士语
科萨语
祖鲁语

代码页标识符

https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
tomas dot hampl at gmail dot com
13 年前
在 Linux 上,setlocale() 依赖于已安装的区域设置。要查看 PHP 可用的区域设置,请从终端运行以下命令:

"locale -a"

提供的列表是您的服务器上 PHP 可用的所有区域设置。要添加新的区域设置,请运行以下命令:

locale-gen <locale name>(这可能需要 sudo/root 权限),例如,要添加捷克语区域设置,请运行类似以下命令:

"sudo locale-gen cs_CZ.utf8"

然后,您可以使用以下区域设置声明:

setlocale(LC_ALL, 'cs_CZ.utf8');
Anonymous
18 年前
下面 bruno dot cenou at revues dot org 的示例展示了这种可能性,但我希望将其阐明:您可以在 setlocale 中添加字符集信息。

示例

在我的 utf-8 编码页面中,我想插入当前月份的名称,恰好是三月,德语为 "März" - 带有变音符。如果您使用以下代码:

setlocale(LC_TIME, 'de_DE');
echo strftime("%B");

这将返回 "M&auml;rz",但在 utf-8 页面上,这个 html 实体将显示为 "M?rz"。这不是我想要的。

但如果您使用以下代码:

setlocale(LC_TIME, 'de_DE.UTF8'); // 注意字符集信息!
echo strftime("%B");

这将返回 "M√§rz",在 utf-8 上,它将显示为 "März",这才是正确的显示。
bryn AT lunarvis DOT com
16 年前
发布此内容希望它对其他人有所帮助,因为我在任何地方都找不到太多信息。如果您想使用威尔士语区域设置,并且已安装相应的语言支持,则将 'cym'(威尔士语 'Cymraeg' 的缩写形式)传递给 setlocale

<?php
setlocale
(LC_TIME, 'cym');
$welsh= gmstrftime("%A, %B %Y - %H:%M",time());
echo
$welsh;
?>

以上内容肯定适用于 Windows 系统,但如果安装了所需的支持,也应该适用于 Unix。

干杯!

Bryn。
data dot ocean dot italia at gmail dot com
11 年前
相反,使用 IIS 与 PHP 时,我必须为意大利语使用以下代码行...

<?php setlocale(LC_ALL, 'Italian_Italy.1250'); ?>
RobQuist
10 年前
除了 russ 关于获取/备份区域设置的说明外
我在单元测试中使用它。我想测试一些基于区域设置的内容,并在测试完成后重置区域设置。

但出现了一些错误;
* setlocale 不再接受字符串。您需要使用常量。
* 一些常量不再存在。

以下是更新后的代码段

<?php
$originalLocales
= explode(";", setlocale(LC_ALL, 0));
setlocale(LC_ALL, 'nl_NL.UTF-8');

// 在这里做一些事情

// 恢复到默认设置
$skipConstants = array( // 这些将由 setlocale(LC_ALL, 0) 返回,但不再存在。
'LC_PAPER',
'LC_NAME',
'LC_ADDRESS',
'LC_TELEPHONE',
'LC_MEASUREMENT',
'LC_IDENTIFICATION'
);

foreach (
$originalLocales as $localeSetting) {
if (
strpos($localeSetting, "=") !== false) {
list (
$category, $locale) = explode("=", $localeSetting);
} else {
$category = LC_ALL;
$locale = $localeSetting;
}

if (!
in_array($category, $skipConstants)) {
setlocale(constant($category), $locale); // 使用字符串已被弃用。
}
}
?>
Periklis
16 年前
在 *某些* Windows 系统中,仅设置 LC_TIME 不会起作用,您必须设置 LC_ALL 或同时设置 LC_CTYPE 和 LC_TIME。但如果您之前已使用 setlocale 在脚本中设置了 LC_TIME,则日期将不会受到影响!例如
<?php
setlocale
(LC_TIME, 'greek');
setlocale(LC_CTYPE, 'greek');
?>
不起作用,而
<?php
setlocale
(LC_CTYPE, 'greek');
setlocale(LC_TIME, 'greek');
?>
则可以正常工作。
birkholz at web dot de
18 年前
当我尝试获取当前区域设置(例如,在我使用 setlocale(LC_ALL, 'de_DE'); 将语言设置为德语后),以下代码在我的 suse linux 9.0 盒子上不起作用
$currentLocale = setlocale(LC_ALL, NULL);
此代码将重置为服务器设置。

$currentLocale = setlocale(LC_ALL, 0); 对我来说运行良好,但手册说在这种情况下 NULL 和 0 是相等的,但 NULL 似乎充当 ""。
aaaaa976 at gmail dot com
9 年前
在 Windows 中,有时 setlocale 无法正常工作,它返回一个空数组,但区域设置已设置。我发现 Apache 在 Windows "加载" 区域设置之前启动,您需要重新启动 Apache 以解决此问题。
michal dot kocarek at brainbox dot cz
16 年前
关于在 Windows 系统上使用 UTF-8 区域设置字符集的说明

根据 MSDN,Windows setlocale() 的实现不支持 UTF-8 编码。

来自 "MSDN setlocale, _wsetlocale" 页面的引文 (http://msdn.microsoft.com/en-us/library/x99tb11d.aspx)
可用的语言、国家/地区代码和代码页集包括 Win32 NLS API 支持的所有代码页,但不包括每字符需要超过两个字节的代码页,例如 UTF-7 和 UTF-8。如果您提供了像 UTF-7 或 UTF-8 这样的代码页,setlocale 将失败,并返回 NULL。

因此,以下代码
<?php setlocale(LC_ALL, 'Czech_Czech Republic.65001'); // 65001 是 UTF-8 代码页 ?>
在 Windows 上根本不起作用。

(编写于 PHP 5.2.4 时代)
mk at totu dot com
20 年前
小心 - 设置使用逗号而不是点作为数字分隔符的区域设置可能会导致 MySQL 数据库无法理解查询
<?php
setlocale
(LC_ALL,"pl");
$price = 1234 / 100; // 现在价格看起来像 12,34
$query = mysql_query("SELECT Id FROM table WHERE price='".$price."'");
?>
即使存在价格 12.34 - 也无法找到任何内容
Leigh Morresi
15 年前
设置系统不支持的区域设置会导致某些字符串操作在需要执行音译的地方返回字符串中的问号 "?"。

1) 始终检查 setlocale() 的返回值,以确保它已设置为支持的内容

2) 在 Linux 上,您可以使用 "locale -a" 命令查找支持的区域设置列表
garygendron at yahoo dot com
14 年前
对于 PHP MySQL 查询,您还可以使用以下代码,例如法语加拿大区域设置:

$query = 'SET lc_time_names = "fr_CA"';
$result = mysql_query($query) or die("Query failed");

$query = 'SELECT @@lc_time_names';
$result = mysql_query($query) or die("Query failed");

$query = 'SELECT id, created, YEAR(created) as year, MONTH(created) as month,' .
' CONCAT_WS(" ", MONTHNAME(created), YEAR(created)) as archive' .
' FROM #__TABLE as e' .
' GROUP BY archive' .
' ORDER BY id DESC';

您的数据将以您想要的任何区域设置显示。您甚至可以从多语言网站中获取 $_GET[lc_time_name]。
szepeshazi at gmail dot com
17 年前
对于那些不幸(像我一样)在 Windows 环境中工作,并尝试将区域设置设置为一种语言 _and_ 为 UTF-8 字符集,并且无法做到的人,这里提供一个解决方法。

例如,要以匈牙利语和 UTF-8 字符集输出日期,这将起作用

$dateString = "%B %d., %A";
setlocale(LC_ALL,'hungarian');
$res=strftime($dateString);
echo(iconv('ISO-8859-1', 'UTF-8', $res));

如果有人知道如何在 Windows 上将区域设置设置为与 unix 上的“hu_HU.UTF-8”等效,请告诉我。
phcorp
13 年前
要查找 Unix 系统的区域设置
<?php system('locale -a') ?>
internationalist
8 年前
我的脚本运行一个循环,它更改区域设置(多语言应用程序)。我注意到,在某些随机情况下,尽管在之前的步骤中执行了 setlocale() 函数,但区域设置仍然没有更改。我必须为此条件添加等待时间。有趣的是,这种情况只发生在 'nl_NL.UTF8' 区域设置中。

<?php
//一些代码
$this->counter = 0;
//一些代码
$this->locale = 'nl_NL.UTF8';
setlocale(LC_ALL, $this->locale);
$this->counter++;
if (
$this->locale !== setlocale(LC_CTYPE, 0)) { // 区域设置尚未更改。
if ($this->counter > 10) {
return;
}
sleep(1);
}
//一些代码
?>
leif at neland dot dk
13 年前
关于区域设置中的连字符,它们似乎应该完全省略。

在 /etc/locale.gen 中,我有

da_DK.ISO-8859-15 ISO-8859-15

但 locale -a 给出

da_DK.iso885915

这是 setlocale() 所需的格式。

(Debian)
Un_passant
15 年前
对于 debian/ubuntu,不要忘记字符集 UFT8。

// 在 Ubuntu 8.04 Server 上有效
setlocale(LC_TIME, 'fr_FR.UTF8', 'fr.UTF8', 'fr_FR.UTF-8', 'fr.UTF-8');
Sven K
18 年前
如果您的系统没有通过“locale -a”显示任何已安装的区域设置,请尝试通过“dpkg-reconfigure locales”(在 debian 上)安装它们。
info AT hipot-studio DOT com
8 个月前
在 PHP 8.2 及更高版本中,PHP 的内部大小写转换函数变得与区域设置无关,这会影响以下函数

strtolower
strtoupper
lcfirst
ucfirst
ucwords
stristr
stripos
strripos
str_ireplace

以上所有函数仅在 ASCII 字符范围内执行大小写转换和比较。
divinity76 at gmail dot com
2 年前
如果有人正在寻找 getlocale(),

<?php
if(!function_exists("getlocale")){
function
getlocale(int $category)/*:string|false*/{
return
setlocale($category, 0);
}
}
?>
tim dot peters at live dot com
5 年前
也许很明显,但我预计 setlocale 常量 (LC_*) 将是按位运算的,但实际上不是。

例如,执行以下操作

<?php
setlocale
(LC_TIME + LC_COLLATE, 'nl');

echo
setlocale(LC_ALL, 0);
?>
将导致以下结果

LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=nl;LC_PAPER=C;
LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

请注意,LC_MESSAGES 已更改,而不是 LC_TIME 和 LC_COLLATE。(因为 LC_TIME + LC_COLLATE = LC_MESSAGES)。

相反,如果您不想使用 LC_ALL,则需要分别指定它们

<?php
setlocale
(LC_TIME, 'nl');
setlocale(LC_COLLATE, 'nl');

echo
setlocale(LC_ALL, 0);
?> LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=nl;LC_COLLATE=nl;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;
LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
ostapk
16 年前
正在开发一个新的 PECL 扩展,名为 intl(它将在 PHP5.3 中可用)。同时,所有依赖 setlocale() 及其朋友的人应该注意它们在 onPHP5.com 博客上这篇文章中所述的限制:http://www.onphp5.com/article/22
mvanbaak
17 年前
为了补充 Sven K 关于 debian 的提示

您还可以安装 locales-all 包
它包含所有已编译形式的区域设置。
flavioacvalverde at gmail dot com
13 年前
对于葡萄牙,我不得不使用

<?php setlocale(LC_ALL, 'Portuguese_Portugal.1252'); ?>

在 Windows 服务器上使用 IIS 的 php。
To Top