Вывод дат в символах, отличных от ASCII, с помощью PHP

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

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

Спасибо, что искали ...


person Neil Hillman    schedule 03.10.2016    source источник


Ответы (2)


Локали бывают не только на разных языках, но и в разных кодировках. Локаль по умолчанию 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');
person deceze♦    schedule 05.10.2016
comment
Блестяще! Спасибо! Это именно то, что мне нужно. Вы сделали мой день! - person Neil Hillman; 05.10.2016

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

person Matijs    schedule 05.10.2016
comment
Спасибо за попытку, @Matijs, но, похоже, это не сработает. Использование mb_convert_encoding () в моем выводе просто преобразует �Q�� в ¤Q¤ë (что тоже неверно)! - person Neil Hillman; 05.10.2016
comment
Хотя ответ deceze лучше (и интересен, поскольку он нигде не упоминается в документации PHP), я немного расстроен тем, что кто-то отметил мой ответ как неправильный. Я четко определил проблему, только mb_detect_encoding () явно обнаруживает неправильную кодировку. Исправление, которое я только что добавил. - person Matijs; 05.10.2016
comment
Мне жаль, что ты обиделся, Матис, я очень ценю твой вклад, но даже с этим дополнительным исправлением я не могу заставить твой ответ работать (по-прежнему выводится ¤Q¤ë). Ответ @deceze дает мне 十月, на что я и надеялся ... - person Neil Hillman; 05.10.2016
comment
До версии 7 PHP в основном не знал кодировку строк - такая же ситуация и в PHP 7. И вы никогда не должны использовать _detect_encoding, это по большей части бесполезно. Либо вы знаете кодировку ваших строк, либо нет, предполагая, что это редко бывает успешным (как вы демонстрируете). - person deceze♦; 05.10.2016