Я пытаюсь вывести дату на традиционном китайском.
У меня есть дата как метка времени Unix (пример: «1467244800»).
Я делаю следующее:
<?php
setlocale (LC_TIME, "zh_TW");
echo strftime("%e %B %Y", $timestamp );
?>
Что я получаю, так это символы Unicode «Undefined»:
30 ���� 2016
17 �T�� 2016
18 �Q�G�� 2015
Может кто-нибудь сказать мне, что я делаю не так?
Мои HTML-заголовки содержат:
<html lang="zh-TW">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
А остальная часть моего китайского контента на странице выводится нормально. Если вы просматриваете страницу источника, вы видите:
<span>最新消息</span>
<span class="pipe">18 �Q�G�� 2015</span>
Это только даты strftime (), которые отображаются как «неопределенные» символы: …
Спасибо за поиск …
Локали не только на разных языках, но и в разных кодировках. По умолчанию zh_TW
locale, вероятно, будет использовать некоторую китайскую кодировку, тогда как вам нужен UTF-8. Следовательно, используйте версию языка UTF-8:
setlocale(LC_TIME, 'zh_TW.UTF-8');
Это зависит от вашей конкретной системы и от того, какие локали на ней установлены. Проверьте это в командной строке:
$ locale -a
...
zh_TW
zh_TW.Big5
zh_TW.UTF-8
Чтобы быть более кросс-платформенным, вы можете попробовать несколько локалей:
setlocale(LC_TIME, 'zh_TW.UTF-8', 'zh_TW.utf8', 'zh_TW');
Вы, вероятно, должны сказать PHP, что все строки имеют формат UTF-8. Например.:
mb_internal_encoding('UTF-8');
Или, если проблема только с этой строкой:
$out = strftime("%e %B %Y", $timestamp);
echo mb_convert_encoding($out, 'UTF-8', mb_detect_encoding($out));
Или если mb_detect_encoding()
не работает правильно:
$out = strftime("%e %B %Y", $timestamp);
echo mb_convert_encoding($out, 'UTF-8', 'CNS-11643');
До версии 7 PHP практически не знал кодировку строк. Все это просто массив из 8 битных байтов. Получение правильной выходной кодировки иногда работает хорошо сразу, но в других случаях вам нужно все настроить вручную.