Outputting dates in non-ASCII characters with PHP

2019-07-14 19:05发布

问题:

I'm trying to output the date in Traditional Chinese.

I have the date as a Unix timestamp, ( example: "1467244800" ).

I am doing the following:

<?php
setlocale (LC_TIME, "zh_TW");
echo strftime("%e %B %Y", $timestamp );
?>

What I'm getting output is the Unicode "Undefined" characters:

30 ���� 2016
17 �T�� 2016
18 �Q�G�� 2015 

Can anyone tell me what I'm doing wrong?

My HTML headers contain:

<html lang="zh-TW">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

And the rest of my Chinese content on the page is outputting fine. If you view the page source you see:

<span>最新消息</span>
<span class="pipe">18 �Q�G�� 2015</span>

It's only the strftime() dates that appear as "Undefined" characters: ����...

Thanks for looking...

回答1:

Locales not only come in different languages, but also different encodings. The default zh_TW locale will probably use some Chinese encoding, while what you want is UTF-8. Hence, use the UTF-8 version of the locale:

setlocale(LC_TIME, 'zh_TW.UTF-8');

This depends on your specific system and what locales are installed on it. Check that on the command line:

$ locale -a
...
zh_TW
zh_TW.Big5
zh_TW.UTF-8

To be more cross-platform compatible, you can try several locales:

setlocale(LC_TIME, 'zh_TW.UTF-8', 'zh_TW.utf8', 'zh_TW');


回答2:

You must probably tell PHP that all strings are UTF-8. E.g.:

    mb_internal_encoding('UTF-8');

Or if the problem is just with this string:

    $out = strftime("%e %B %Y", $timestamp);
    echo mb_convert_encoding($out, 'UTF-8', mb_detect_encoding($out));

Or if mb_detect_encoding() does not work correctly:

    $out = strftime("%e %B %Y", $timestamp);
    echo mb_convert_encoding($out, 'UTF-8', 'CNS-11643');

Before version 7 PHP basically does not know the encoding of the strings. Everything is just an array of 8 bit bytes. Getting the right output encoding sometimes works OK at once, but at other times you have to set everything up by hand.