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

Спасибо, что посмотрели...

Author: Neil Hillman, 2016-10-03

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');
 2
Author: deceze, 2016-10-05 09:55:46

Вероятно, вы должны сообщить 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
Author: Matijs, 2016-10-05 10:18:04