utf-8 Carbon格式的错误字符

And*_*ipe 1 php laravel php-carbon laravel-5

我知道有很多关于此的内容,但是它不起作用,我已经安装了该语言。

locale -a | grep es
 es_ES
 es_ES.ISO8859-1
 es_ES.ISO8859-15
 es_ES.UTF-8
Run Code Online (Sandbox Code Playgroud)

我已经设置为utf-8

\Carbon\Carbon::setUtf8(true);
setlocale(LC_ALL, 'es_ES.UTF-8');
$game_date = $date->formatLocalized('%A %d %B %Y %H %M %p');
Run Code Online (Sandbox Code Playgroud)

我的html中有utf-8标签

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

但是我仍然得到错误的字符。

“sábado”-“miércoles”

J. *_*bet 5

尝试使用sk_SK.UTF-8语言环境时,我遇到了同样的问题。帮助我解决问题的是删除了\Carbon\Carbon::setUtf8(true);部分代码。

但是为什么它如此工作?首先,关于setUtf8函数的Carbon文档说:

某些语言要求打印utf8编码(主要不是以.UTF8结尾的语言环境软件包)。在这种情况下,可以使用静态方法Carbon :: setUtf8()来编码对utf8字符集的formatLocalized()调用的结果。

在检查Carbon的源代码后,如果我们已经使用前面提到的将utf8变量设置为true,则该函数从PHP库formatLocalized()调用utf8_encode()函数Carbon::setUtf8(true)。 GitHub上的碳源

return static::$utf8 ? utf8_encode($formatted) : $formatted;
Run Code Online (Sandbox Code Playgroud)

因为您的语言环境已经配置为使用UTF-8标准,所以进一步的php编码会使格式化的字符串混乱。

我认为,如果您想使用Carbon来将字符串格式设置为utf8,则在使用设置语言环境时必须首先摆脱UTF-8编码setLocale()。但是,我只是坚持删除Carbon函数并使用正确的语言环境。

TL; DR

例如es_ES.UTF-8,使用带有UTF-8编码的正确语言环境,或尝试使用不带UTF-8编码的语言环境并依赖\Carbon\Carbon::setUtf8(true);和utf8_encode()功能。我建议第一种选择。希望这有帮助:)