使用PHP以非ASCII字符输出日期

时间:2016-10-03 09:59:58

标签: php utf-8 non-ascii-characters strftime chinese-locale

我试图用繁体中文输出日期。

我将日期作为Unix时间戳,(例如:" 1467244800")。

我正在做以下事情:

Add-Type -AssemblyName "SomeNameSpace"

我得到的输出是Unicode" Undefined"字符:

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

谁能告诉我我做错了什么?

我的HTML标头包含:

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

我页面上的其他中文内容输出正常。如果您查看页面源,您会看到:

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

只有strftime()日期显示为&#34; Undefined&#34;人物:����...

感谢您的期待...

2 个答案:

答案 0 :(得分: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');

答案 1 :(得分:0)

你必须告诉PHP所有字符串都是UTF-8。 E.g:

    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位字节的数组。获得正确的输出编码有时可以正常工作,但有时你必须手动设置所有内容。