Php 害怕????而不是显示中文文本时的字符。简体中文问题

Php 害怕????而不是显示中文文本时的字符。简体中文问题,php,windows,character-encoding,drupal-6,Php,Windows,Character Encoding,Drupal 6,我正在尝试使用Drupal6生成一个多语言版本。我的网站托管在Windows IIS 7.5服务器上 我已经上传了我的.po文件,一切都很好。我现在正处于这样一个阶段,我正在一块一块地浏览这个网站,试图剔除我第一次翻译这个网站时没有注意到的任何东西 我遇到的问题是试图以区域设置格式显示日期 以下是我用来显示本地日期的php代码: $format = "%A, %b %#d, %Y : %H:%M%p" if($language->language == 'zh-hans') {

我正在尝试使用Drupal6生成一个多语言版本。我的网站托管在Windows IIS 7.5服务器上

我已经上传了我的.po文件,一切都很好。我现在正处于这样一个阶段,我正在一块一块地浏览这个网站,试图剔除我第一次翻译这个网站时没有注意到的任何东西

我遇到的问题是试图以区域设置格式显示日期

以下是我用来显示本地日期的php代码:

$format = "%A, %b %#d, %Y : %H:%M%p"

if($language->language == 'zh-hans')
{
    $loc=setlocale(LC_TIME, 'chs');
}else{
    $loc=setlocale(LC_TIME, 'de');
}
$mytime = strftime($format, $time);
$mytime = iconv(mb_detect_encoding($mytime), 'utf-8', $mytime);

echo $mytime;
上述代码应以当前语言的本地格式(中文或德语)显示日期

德国人如预期的那样显示:

弗雷塔格,2013年6月21日:16:48

但中国的产出是这样的:

if($language->language == 'zh-hans')
{
    $loc=setlocale(LC_ALL, 'chs');
}else{
    $loc=setlocale(LC_ALL, 'de');
}
$mytime = iconv($codepage, 'utf-8', $mytime);
??2013年12月21日:16:48


关于如何解决这个问题有什么想法吗?

第一个问题是设置
LC\u TIME
类别本身是不够的。
strftime
函数将尝试用适当的语言格式化时间,但默认情况下它似乎使用1252代码页,因此它将无法生成类似中文的必要字符

我本以为设置
LC\u TIME
LC\u CTYPE
就足够了,但我能让它工作的唯一方法是使用
LC\u ALL
。因此,您的
setlocale
调用应该如下所示:

if($language->language == 'zh-hans')
{
    $loc=setlocale(LC_ALL, 'chs');
}else{
    $loc=setlocale(LC_ALL, 'de');
}
$mytime = iconv($codepage, 'utf-8', $mytime);
下一个问题是
mb\u detect\u编码
并不总是检测正确的编码。对我来说,在Windows上工作的是使用
setlocale(LC\u CTYPE,0)
返回当前代码页

$codepage = explode('.',setlocale(LC_CTYPE, 0));
$codepage = 'cp'.$codepage[1];
调用
setlocale(LC_CTYPE,0)
返回的值是语言名称和用点分隔的代码页码的组合。我们用
explode
将这两部分分开,然后在数字前面加上
cp
前缀,以
iconv
可以理解的形式获得代码页

然后,我们可以简单地将字符串转换为utf-8,如下所示:

if($language->language == 'zh-hans')
{
    $loc=setlocale(LC_ALL, 'chs');
}else{
    $loc=setlocale(LC_ALL, 'de');
}
$mytime = iconv($codepage, 'utf-8', $mytime);

第一个问题是设置
LC\u时间
类别本身是不够的。
strftime
函数将尝试用适当的语言格式化时间,但默认情况下它似乎使用1252代码页,因此它将无法生成类似中文的必要字符

我本以为设置
LC\u TIME
LC\u CTYPE
就足够了,但我能让它工作的唯一方法是使用
LC\u ALL
。因此,您的
setlocale
调用应该如下所示:

if($language->language == 'zh-hans')
{
    $loc=setlocale(LC_ALL, 'chs');
}else{
    $loc=setlocale(LC_ALL, 'de');
}
$mytime = iconv($codepage, 'utf-8', $mytime);
下一个问题是
mb\u detect\u编码
并不总是检测正确的编码。对我来说,在Windows上工作的是使用
setlocale(LC\u CTYPE,0)
返回当前代码页

$codepage = explode('.',setlocale(LC_CTYPE, 0));
$codepage = 'cp'.$codepage[1];
调用
setlocale(LC_CTYPE,0)
返回的值是语言名称和用点分隔的代码页码的组合。我们用
explode
将这两部分分开,然后在数字前面加上
cp
前缀,以
iconv
可以理解的形式获得代码页

然后,我们可以简单地将字符串转换为utf-8,如下所示:

if($language->language == 'zh-hans')
{
    $loc=setlocale(LC_ALL, 'chs');
}else{
    $loc=setlocale(LC_ALL, 'de');
}
$mytime = iconv($codepage, 'utf-8', $mytime);

它在哪里看起来像这样?在控制台上?在网页上?在数据库中?我猜是在一个网页上,标准的修复程序包括
标题('Content-Type:text/html;charset=utf-8')可能会解决此问题。。。可能;)上面给出的结果显示在网站上。我添加了一个附和声明,以使其更加清晰。字符集设置为utf-8。我要补充的是,页面的其余部分完全以中文文本显示,只有strftime返回的日期显示为问题marks@Cypher这本书很有趣,但与我提出的问题无关。问题不在于对Unicode的历史缺乏了解,也不在于对内容类型头的重要性缺乏了解?在控制台上?在网页上?在数据库中?我猜是在一个网页上,标准的修复程序包括
标题('Content-Type:text/html;charset=utf-8')可能会解决此问题。。。可能;)上面给出的结果显示在网站上。我添加了一个附和声明,以使其更加清晰。字符集设置为utf-8。我要补充的是,页面的其余部分完全以中文文本显示,只有strftime返回的日期显示为问题marks@Cypher这本书很有趣,但与我提出的问题无关。问题不在于对Unicode的历史缺乏了解,也不在于对内容类型标题的重要性缺乏了解。我必须说,这是我在这个网站上得到的最完整、信息最丰富的答案。非常感谢您的时间和努力!我不得不说,这是我在这个网站上收到的最完整、最翔实的答案。非常感谢您的时间和努力!