【问题标题】:German Umlauts in strftime date-formatting - correct utf-8 encoding?strftime 日期格式中的德语变音符号 - 正确的 utf-8 编码?
【发布时间】:2012-09-22 17:47:39
【问题描述】:

我正在使用 PHP 14. März 2012(即 2012 年 3 月 14 日)创建这样的德语日期格式。

我正在使用包含 unix 时间戳的 $date[0],我将其转换为可读的德语日期。

$date_day_month = strftime('%d. %B', $date[0]);
$date_year = strftime('%Y', $date[0]);

echo $date_day_month . $date_year;

但是我以某种方式得到了像这样的 Umlaut ä 的问号

14. M�rz 2012

为什么会这样,我该如何解决?提前致谢。

【问题讨论】:

  • uft-8 编码(在问题的标题中)是错字吗?我猜你的意思是 UTF-8?
  • @user1180316 是一个错字。对不起。 @Dagon 我的<meta charset="UTF-8" /> 中有head

标签: php encoding utf-8 diacritics


【解决方案1】:

在我的情况下,只需更改语言环境就可以了。

代替:

setlocale(LC_TIME, "de_DE");

用途:

setlocale(LC_TIME, "de_DE.UTF-8");

【讨论】:

  • 建议的“de_DE-UTF-8”或在我的情况下为“de_AT.UTF-8”,分别在 php 手册中看到的“de_AT.utf8”在我的主机上不可用(Windows Azure网站(=PaaS)),我必须使用“german_austria”,但这不是 UTF8 语言环境,因此输出 ä's ö's 和 ü's 为 � - 你知道如何解决这个问题或如何使用 php 找出所有已安装的语言环境- 它是一台运行 IIS8 的 Windows 机器,但它只是一个托管网站,我没有系统访问权限。
  • @DanielSteiner 作为一种解决方法,将您的strftime 调用封装在utf8_encode 中。请参阅 php.net/manual/en/resourcebundle.locales.php 了解如何获取所有支持的语言环境的列表。
  • 对我来说就像一个魅力。谢谢。
【解决方案2】:

在 Windows 环境 (XAMPP) 中,setlocale(LC_TIME, "de_DE.UTF-8") 没有为我解决问题,所以我求助于使用语言环境 "de" 然后 - 正如 @Chris 在他对 another answer 的评论中建议的那样 - 将字符串手动转换为utf8:

setlocale(LC_TIME, "de");
$maerzLatin1 = strftime('%B', mktime(9, 0, 0, 3, 1, 2016));
$maerzUtf8 = utf8_encode($maerzLatin1);  // this one contains "März" UTF8-encoded

【讨论】:

    【解决方案3】:

    您可以尝试将您的网页设为 utf-8,将其放入您的 head 标签中:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    

    strftime 取决于区域设置的正确设置,因此请检查您的setlocale() 并确保该区域设置存在于运行 php 的机器上。

    更新

    我在我的服务器上运行了这段代码:

    setlocale(LC_ALL, 'de_DE');
    $date[0] = mktime( 1, 0, 0, 3, 2, 2012 );
    
    $date_day_month = strftime('%d. %B', $date[0]);
    $date_year = strftime('%Y', $date[0]);
    
    echo $date_day_month . $date_year;
    

    然后输出:

    02. März2012

    【讨论】:

    • 嗯,没什么区别,我的head 中已经有&lt;meta charset="UTF-8" /&gt;。页面的其余部分(基于 Wordpress)适用于所有变音符号,只是这个日期有问题。
    • 嗯,谢谢,但也不是这样……我测试了这个$locale = get_locale(); //setlocale(LC_TIME, $locale); setlocale(LC_ALL, 'de_DE'); 所以我已经正确设置了区域设置,因为我的整个博客都是德语,它具有正确的区域设置。我尝试完全按照您的建议添加setlocale 行,甚至第二次但没有成功。
    • hmm .. 那么没有选择了。如您所见,我使用了完全相同的代码,并且得到了正确的输出。也许是您博客的链接?
    • 我刚刚复制并粘贴了,在我的网络服务器上它也可以工作。正如我所说,语言环境必须存在于网络服务器上。也许不是 de_DE 而是 de_DE.utf8 ??
    • 就是这样!非常感谢!我添加了setlocale(LC_ALL, 'de_DE.utf8');,现在效果很好!
    猜你喜欢
    • 2014-08-30
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2011-12-08
    • 2021-07-08
    相关资源
    最近更新 更多