PHP/WordPress中瑞典语星期名称输出编码错误求助
问题分析与解决方案
你的代码出现特殊字符变成问号的问题,核心原因是服务器环境的 locale 配置或字符集编码和本地不一致,具体来说有这几个常见问题:
1. 服务器未安装带 UTF-8 编码的瑞典语 locale
setlocale(LC_TIME,'sv_SE') 只指定了语言,但很多服务器默认的 sv_SE locale 可能是 ISO-8859-1 编码(而非网页常用的 UTF-8),导致输出的特殊字符(比如å、ä、ö)和页面编码不兼容,显示成问号。
解决步骤:
- 先登录服务器,执行命令
locale -a查看已安装的 locale,确认是否有sv_SE.UTF-8或sv_SE.utf8。 - 如果没有,根据服务器系统安装对应包:
- Ubuntu/Debian:
sudo apt-get install language-pack-sv - CentOS/RHEL:
sudo yum install glibc-langpack-sv
- Ubuntu/Debian:
- 然后在代码里明确指定 UTF-8 版本的 locale:
多写几个备选值是为了兼容不同系统的命名差异。setlocale(LC_TIME, 'sv_SE.UTF-8', 'sv_SE', 'swedish');
2. PHP 输出的字符集未设置为 UTF-8
即使 locale 正确,如果 PHP 输出的内容不是 UTF-8 编码,也会导致乱码。
解决方法:
- 在代码最开头添加:
header('Content-Type: text/html; charset=utf-8'); - 或者在服务器的
php.ini里设置全局默认编码:default_charset = "UTF-8"
3. 替代方案:使用 IntlDateFormatter 摆脱系统 locale 依赖
strftime 强依赖服务器的系统 locale 配置,一旦服务器没装对应包就会出问题。更可靠的方式是用 PHP 的 IntlDateFormatter 扩展(需要确保服务器启用了 intl 扩展),它不依赖系统 locale,直接通过 PHP 内置的国际化组件生成多语言日期:
$date_pre = get_field("date"); // 格式为20180518 // 先把字符串转成 DateTime 对象 $date = DateTime::createFromFormat('Ymd', $date_pre); // 初始化瑞典语日期格式化器 $formatter = new IntlDateFormatter( 'sv_SE', IntlDateFormatter::FULL, // 星期的格式(FULL是完整名称) IntlDateFormatter::NONE, // 不需要时间部分 date_default_timezone_get(), IntlDateFormatter::GREGORIAN, 'EEEE d MMMM' // 输出格式:星期 日 月份(完整名称) ); // 格式化后转成小写(符合你的需求) $date_l = strtolower($formatter->format($date));
这个方法不需要服务器额外安装 locale 包,只要 intl 扩展启用,就能稳定输出正确编码的瑞典语日期。
内容的提问来源于stack exchange,提问作者tobiasg
相关产品推荐
相关产品推荐

