PHP Conference Japan 2024

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 条注释

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

setlocale (LC_ALL, "Dutch");

在我的页面上获得荷兰语的星期几。从那一刻起(正如我许多小时后发现的那样),我的来自 MYSQL 的浮点值被解释为整数,因为荷兰语区域设置希望在小数点前使用逗号 (,) 而不是点 (.)。我尝试过 printf、number_format、floatval……都无济于事。1.50 总是打印为 1.00 :(

当我将我的区域设置设置为

setlocale (LC_TIME, "Dutch");

我的星期几现在都很好,我的浮点值也很好。

我希望我能避免其他人自己弄清楚这个问题。

Rob
53
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() 函数只是包装了等效的系统调用,因此您的结果可能会有所不同。
12
epistomai at gmail dot com
5 年前
setlocale(LC_MONETARY, 'en_US') 不再起作用(至少在 PHP 版本 7.3.8 中是这样)。

我改用了 'en_US.UTF-8'
16
Shashakhmetov Talgat
9 年前
//修复 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;
}
}
18
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'));
?>
14
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”在操作系统级别创建区域设置。
1
lingureanumanuel at yahoo dot com
2 年前
对于 Windows

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

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

“区域设置”始终取决于服务器配置。


当尝试在某些服务器上使用“pt_BR”时,您将始终获得 false。即使使用其他语言也是如此。

服务器需要支持区域设置字符串。有时一种语言会有不同的字符集,例如“pt_BR.utf-8”和“pt_BR.iso-8859-1”,但对“pt_BR”_标准_没有支持。

此问题也出现在 Windows 平台上。在这里,您需要调用“葡萄牙语”或“西班牙语”或“德语”或…

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

但在编写日期转换或数字格式化等函数时,**切勿**依赖它。确保操作正确的最佳方法是,不调用 `setlocale()` 函数,而是使用默认的 "en_US" 或 "en_UK"。或者,通过一些测试,确保您的服务器支持您想要使用的语言。

请记住:使用默认的区域设置是与其他应用程序(如数据库或 RPC 服务器)“通信”的最佳方式。

[]s

Pigmeu
2
stepdate at gmail dot com
6 年前
如果您已安装区域设置但无法正常工作,请检查拼写:对于德语,所有注释都建议使用 "setlocale(LC_TIME, "de_DE.utf8")", 但必须使用 "setlocale(LC_TIME, "de_DE.UTF-8")" -> UTF-8 而不是 utf8。
8
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
3
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');
5
匿名用户
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"。
2
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。
3
data dot ocean dot italia at gmail dot com
11 年前
相反,在使用 IIS 的 PHP 中,我必须使用以下行来设置意大利语…

<?php setlocale(LC_ALL, 'Italian_Italy.1250'); ?>
2
RobQuist
11 年前
除了 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); //使用字符串已弃用。
}
}
?>
3
Periklis
17 年前
在某些 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');
?>
可以正常工作。
3
birkholz at web dot de
19 年前

当我尝试获取当前区域设置(例如,在使用 setlocale(LC_ALL, 'de_DE'); 将语言设置为德语后),以下代码在我的 suse linux 9.0 系统上不起作用。
$currentLocale = setlocale(LC_ALL, NULL);
此代码将区域设置重置为服务器设置。

$currentLocale = setlocale(LC_ALL, 0); 对我来说完美运行,但是手册说 NULL 和 0 在这种情况下是相等的,但 NULL 似乎表现得像 ""。
1
aaaaa976 at gmail dot com
9 年前
在 Windows 中,有时 setlocale 无法正常工作,它返回一个空数组,但区域设置已设置。我发现 Apache 在 Windows “加载” 区域设置之前启动,您必须重新启动 Apache 才能解决此问题。
2
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 时期)
3
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 - 也将找不到任何结果
3
Leigh Morresi
16 年前
设置系统不支持的区域设置会导致某些字符串操作在需要执行音译的字符串中返回问号“?”。

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

2) 在 Linux 上,您可以使用“locale -a”命令查找受支持的区域设置列表
2
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]。
2
szepeshazi at gmail dot com
17 年前
对于那些不幸(像我一样)在 Windows 环境中工作并尝试将区域设置设置为某种语言 _和_ 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”等效的设置,请告诉我。
1
phcorp
13 年前
查找 Unix 系统的区域设置
<?php system('locale -a') ?>
1
internationalist
9 年前
我的脚本运行一个循环,该循环更改区域设置(多语言应用程序)。我注意到,在某些随机情况下,尽管 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);
}
// 一些代码
?>
1
leif at neland dot dk
14 年前
关于区域设置中的短横线,它们似乎应该完全省略。

在 /etc/locale.gen 中我有

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

但 locale -a 给出

da_DK.iso885915

这是 setlocale() 期望的格式。

(Debian)
2
Un_passant
16 年前
对于 Debian/Ubuntu,不要忘记字符集 UFT8。

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

strtolower
strtoupper
lcfirst
ucfirst
ucwords
stristr
stripos
strripos
str_ireplace

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

<?php
if(!function_exists("getlocale")){
function
getlocale(int $category)/*:string|false*/{
return
setlocale($category, 0);
}
}
?>
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
0
ostapk
16 年前
正在开发一个名为 intl 的新 PECL 扩展(它将在 PHP5.3 中可用)。同时,所有依赖于 setlocale() 及其相关函数的人员都应该了解其限制,如 onPHP5.com 博客上的这篇文章所述:http://www.onphp5.com/article/22
-1
mvanbaak
17 年前
补充 Sven K 关于 Debian 的提示

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

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

在 Windows 服务器上使用 IIS 与 PHP。
To Top