php strftime法语字符

ian*_*ckc 26 php

我正在一个用户可以在英语和法语之间切换的网站上工作.输出帖子的日期.

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

setlocale(LC_ALL, 'fra_fra');
Run Code Online (Sandbox Code Playgroud)

然后输出我使用的日期:

strftime('%d %B %Y', strtotime($post->post_date));
Run Code Online (Sandbox Code Playgroud)

我在utf-8上有我的字符集:

<meta charset="utf-8">
Run Code Online (Sandbox Code Playgroud)

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

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

jer*_*oen 64

这似乎是该strftime功能的问题/错误.

您可以使用以下方法解决

$date_string = utf8_encode(strftime('%d %B %Y', strtotime($post->post_date)));
Run Code Online (Sandbox Code Playgroud)

  • 问题是,对于已经在'utf-8`中的字符串的`utf8_encode`将使重音更加复杂_甚至更多_.另外,`mb_detect_encoding`已将`F vrier`(应该读为'Février`)报告为'utf-8`. (3认同)
  • @RémiBreton实际上,如果您将“$strict”参数设置为“true”进行检查,它会起作用:如果“$str”是UTF,“mb_detect_encoding($str, 'UTF-8', true)”将返回“true” -8(Février),如果不是(Février)则为“假”。 (2认同)
  • 选择UTF-8语言环境是更好的方式,因为许多其他注释显示它(fr_FR.UTF-8). (2认同)

And*_*e F 13

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

header('Content-Type: text/html; charset=UTF-8');
Run Code Online (Sandbox Code Playgroud)

由于在使用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));
?>
Run Code Online (Sandbox Code Playgroud)

  • `setlocale(LC_ALL,'fr_FR.UTF8');`,而不仅仅是''fr_FR'`,为我修复它. (14认同)

dec*_*eze 10

语言环境有不同的编码!您使用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
Run Code Online (Sandbox Code Playgroud)

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

setlocale(LC_ALL, 'fr_FR.UTF-8');
Run Code Online (Sandbox Code Playgroud)

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


Lim*_*isa 6

<?php
    date_default_timezone_set('Europe/Istanbul');
    setlocale(LC_TIME,"turkish");
    echo date("d.m.Y").' - '.iconv("ISO-8859-9","UTF-8",strftime('%A'));
?>
Run Code Online (Sandbox Code Playgroud)

// 11.06.2015 - Per?embe