Вывод дат в символах, отличных от ASCII, с помощью PHP
Я пытаюсь вывести дату на традиционном китайском языке.
У меня есть дата в качестве временной метки Unix (пример: "1467244800" ).
Я делаю следующее:
<?php
setlocale (LC_TIME, "zh_TW");
echo strftime("%e %B %Y", $timestamp );
?>
Я получаю вывод "Неопределенных" символов Юникода:
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() отображаются как "Неопределенные" символы: ����...
Спасибо, что посмотрели...
2 answers
Локали бывают не только на разных языках, но и в разных кодировках. Локаль по умолчанию zh_TW
, вероятно, будет использовать некоторую китайскую кодировку, в то время как вы хотите использовать 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-битных байтов. Получение правильной выходной кодировки иногда работает нормально сразу, но в других случаях вам приходится все настраивать вручную.