utf 8 — Вывод дат в не-ASCII символах с переполнением стека

Я пытаюсь вывести дату на традиционном китайском.

У меня есть дата как метка времени 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 (), которые отображаются как «неопределенные» символы: …

Спасибо за поиск …

2

Решение

Локали не только на разных языках, но и в разных кодировках. По умолчанию 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');
2

Другие решения

Вы, вероятно, должны сказать 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 битных байтов. Получение правильной выходной кодировки иногда работает хорошо сразу, но в других случаях вам нужно все настроить вручную.

0