【问题标题】:php strftime French charactersphp strftime 法语字符
【发布时间】:2012-01-24 20:52:41
【问题描述】:

我正在开发一个用户可以在英语和法语之间切换的网站。输出帖子的日期。

如果用户选择法语,我使用:

setlocale(LC_ALL, 'fra_fra');

然后输出我使用的日期:

strftime('%d %B %Y', strtotime($post->post_date));

我的字符集为 utf-8:

<meta charset="utf-8">

我遇到的问题是像 û 这样的字符和其他带有重音符号的字符只显示为带有问号的黑色菱形。

有没有办法解决这个问题?

【问题讨论】:

  • 您是否在一般页面内容或仅在日期方面存在此问题?
  • 它只发生在日期中。使用 utf8_enocde 已解决此问题

标签: php


【解决方案1】:

这似乎是strftime 函数的问题/错误。

您可以使用以下方法解决它:

$date_string = utf8_encode(strftime('%d %B %Y', strtotime($post->post_date)));

【讨论】:

  • 完美!谢谢。
  • 完美!也解决了我的问题。日期格式有重音,必须将其添加为 UTF8 代码。不得不改变:%e %B %Y à%kh%M 到:%e %B %Y &amp;agrave; %kh%M
  • 问题是,utf8_encode 在已经存在于utf-8 中的字符串上会使重音更加混乱。此外,mb_detect_encoding 已将F�vrier(应为Février)报告为utf-8
  • @RémiBreton 实际上,如果您将$strict 参数设置为true 进行检查,它可以工作:如果$str 是UTF-8 (Février),mb_detect_encoding($str, 'UTF-8', true) 将返回true 并且false 如果不是 (F�vrier)。
  • 选择 UTF-8 区域设置是许多其他 cmets 显示的更好方法 (fr_FR.UTF-8)。
【解决方案2】:

如果您使用 utf8 编码显示您的页面,您希望将 utf8 排除在 strftime 之外。

如果 php 的字符集是 utf8,那么你正在做饭。如果没有,您可以:

  • utf8_encode()strftime 的输出。

  • 如果您的系统上安装了此语言环境,请将'.utf8' 附加到您的语言环境语句中,如setlocale(LC_ALL, 'fr_FR.utf8')

  • 更改 php 的默认字符集,将行 AddDefaultCharset UTF-8 放入您的 php.ini 或您的 .htaccess

【讨论】:

    【解决方案3】:

    Content-Type 标头需要将代码页设置为 UTF-8。

    header('Content-Type: text/html; charset=UTF-8');
    

    由于使用 echoprint 将任何内容输出到页面后,您无法更改标题,因此请确保在页面的早期设置它。

    ASCII 代码页完全包含在 UTF-8 中,反之亦然。

    UTF-8 标头替换为 ASCII 标头,您会看到当前代码页中不包含字符时会发生什么。

    <?php
    header('Content-Type: text/html; charset=UTF-8');
    //header('Content-Type: text/html; charset=ASCII');
    
    $myDate = "Feb 23, 2011";
    
    $locale = 'fr_FR.UTF-8';
    setlocale(LC_ALL, $locale);
    echo strftime('%d %B %Y', strtotime($myDate));  
    
    $locale = 'en_US.UTF-8';
    setlocale(LC_ALL, $locale);
    echo strftime('%d %B %Y', strtotime($myDate));
    ?>
    

    【讨论】:

    • setlocale(LC_ALL, 'fr_FR.UTF8');,而不仅仅是'fr_FR',为我修复了它。
    【解决方案4】:

    语言环境有不同的编码!您正在宣传您的网站使用 UTF-8,但 strftime 不返回 UTF-8 编码字符串,因为您选择的语言环境不是 UTF-8 语言环境。检查您的系统您有哪些语言环境,例如:

    $ locale -a | grep fr_FR
    fr_FR
    fr_FR.ISO8859-1
    fr_FR.ISO8859-15
    fr_FR.UTF-8
    

    然后选择您的语言环境的 UTF-8 变体,例如:

    setlocale(LC_ALL, 'fr_FR.UTF-8');
    

    如果您没有可用的语言环境的 UTF-8 变体,请查阅操作系统的帮助系统如何安装它,或者在 PHP 中进行编码转换。

    【讨论】:

    • Windows 操作系统呢?
    【解决方案5】:
    <?php
        date_default_timezone_set('Europe/Istanbul');
        setlocale(LC_TIME,"turkish");
        echo date("d.m.Y").' - '.iconv("ISO-8859-9","UTF-8",strftime('%A'));
    ?>
    

    // 11.06.2015 - Perşembe

    【讨论】:

      【解决方案6】:
      utf8_encode(strftime('%e %B %Y', $this->createDate->getTimestamp()))
      

      不适合我

          class DateUtil
          {
          const FORMAT_DAY_OF_WEEK        = '%A';
          const FORMAT_HUMANY             = '%e %B %Y';
      
          private static $monthInGenitiveCase = [
              '01' => 'января',
              '02' => 'февраля',
              '03' => 'марта',
              '04' => 'апреля',
              '05' => 'мая',
              '06' => 'июня',
              '07' => 'июля',
              '08' => 'августа',
              '09' => 'сентября',
              '10' => 'октября',
              '11' => 'ноября',
              '12' => 'декабря'
          ];
      
          public static function dow(DateTime $date)
          {
              return self::format($date, self::FORMAT_DAY_OF_WEEK);
          }
      
          public static function humany(DateTime $date)
          {
              return self::format($date, '%e ') .self::$monthInGenitiveCase[self::format($date, '%m')] .self::format($date, ' %Y');
          }
      
          public static function format(DateTime $date, $format)
          {
              return strftime($format, $date->getTimestamp());
          }
      
      }
      

      用法

      DateUtil::humany($this->createDate)
      

      当然它只适用于一种语言,但在某些情况下就足够了。

      【讨论】:

        【解决方案7】:

        你在标题上添加了这个吗?

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

        【讨论】:

        • 许多关于字符串的非二进制安全函数都有一个 mb_xxxx 等效项。所以也考虑这个php.net/manual/en/ref.mbstring.php
        • utf-8 一个字母是两个字节。通常带问号的菱形字符表示一个字符的两个字节中的一个字节。
        【解决方案8】:

        遇到了这个问题,但 header()utf8_encode()setlocale() 不起作用,我们不知道实际的编码。这就是我们解决它的方法(如果它对任何人有帮助的话):

        // $date_start is a DateTime instance
        $month = strftime("%b", $date_start->getTimestamp());
        
        // The default value for the 3rd argument is FALSE, this can cause issues
        $encoding = mb_detect_encoding($month, 'auto', true);
        
        // We can now correctly convert the string to UTF-8
        $converted = mb_convert_encoding($month, 'UTF-8', $encoding);
        

        注意:utf8_encode 只需要从 ISO-8859-1 编码的字符串进行编码。

        手动:

        【讨论】:

          【解决方案9】:

          我认为你可以使用该功能:

          echo utf8_encode(strftime('%d %B %Y', strtotime($post-&gt;post_date)))

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-16
            • 2017-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-17
            • 1970-01-01
            相关资源
            最近更新 更多