【问题标题】:Character encoding within German date created with strftime() [duplicate]使用 strftime() 创建的德语日期中的字符编码 [重复]
【发布时间】:2019-01-23 20:29:47
【问题描述】:

这是关于包含特殊字符的德语月份名称的错误显示(元音变音,基本上只有“März”中的字母“ä” - 三月的德语)。我试图将其显示为“28. März 2012”。

这是在 Wordpress 中,顺便说一句。在标题中,我有 <meta charset="utf-8"> 标签。相应的模板文件包含以下行以获取德语月份名称:

setlocale (LC_ALL, 'de_AT@euro', 'de_AT', 'de', 'ge');

实际上,此代码用于“奥地利德语”,但对于 March = März 月份应该没有影响。

对于页面,我从数据库中获取表示日期的字符串,例如“18.03.2012”。然后我将该字符串转换为“真正的”PHP date():

$date_start = date_create($date_string_from_database);

由于我需要将该日期与另一个时间戳进行比较,因此我将其转换为像这样的timestamp(添加固定时间 20:00):

$timestamp_start = strtotime(date_format($date_start, 'Y-m-j 20:00'));

之后的某个时间,我创建了一个格式化的日期,其中包含从这个时间戳中拼出的德语月份名称,如下所示:

$date_german = strftime("%e. %B %Y", $timestamp_start);

现在,在我的 localhost 安装中,它按预期显示:

但是在性能服务器上,我得到了这个:

该页面上的所有其他特殊字符(包括“ä”)都正确显示,这必须与服务器处理 strftime 函数或 setlocale 设置的方式有关。 FWIW,生成的 HTML 代码也包含那个“?”字符而不是“ä”。两种情况下的 PHP 版本都是 5.6。

知道我可以做些什么来让它正确显示吗?

关于可能重复的编辑/添加:这与字符集元标记(我设置,正如我在问题中描述的那样)无关,也与编码/解码数据库结果无关。已接受答案中的方法对我来说效果很好,并且该解决方案未在重复中提及。

【问题讨论】:

标签: php wordpress strftime


【解决方案1】:

使用 utf8_encode。

$date_german = strftime("%e. %B %Y", $timestamp_start);
$date_german = utf8_encode($date_german);

【讨论】:

  • @johannes 还要检查服务器系统上可用区域设置的列表。可能有一个特定的语言环境已经支持 utf-8。例如看这个答案:stackoverflow.com/a/18229644/101087
  • 这是一个糟糕的解决方案。它仅在区域设置碰巧使用 ISO-8859-1 编码时才有效,并且在所有其他情况下都会以相同的方式中断。
  • 今天 PHP 版本发生了变化,不幸的是,该方法现在不再起作用了。我通过包括setlocale(LC_TIME, "de_AT.UTF-8"); 然后$date_german = strftime("%e. %B %Y", $timestamp_start); 来让它工作
猜你喜欢
  • 2017-12-14
  • 2012-09-22
  • 2012-01-21
  • 2013-05-17
  • 2018-10-12
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多