可怕????显示中文文本时代替字符。简体中文字符问题

时间:2013-06-21 14:58:56

标签: php windows character-encoding drupal-6

我正在尝试使用Drupal 6生成多语言。我的网站托管在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;

以上代码应以当前语言的本地格式显示日期(德语为中文)

德语显示如预期:

  

Freitag,2013年6月21日:16:48

但是中文输出看起来像这样:

  

???,?? 21,2013:16:48 ??

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:3)

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

我原本预计设置LC_TIMELC_CTYPE就足够了,但我能让它工作的唯一方法就是使用LC_ALL。因此,您的setlocale来电应如下所示:

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

下一个问题是mb_detect_encoding并不总能检测到正确的编码。在Windows上对我有用的是使用setlocale(LC_CTYPE, 0)来取回当前的代码页。

$codepage = explode('.',setlocale(LC_CTYPE, 0));
$codepage = 'cp'.$codepage[1];

setlocale(LC_CTYPE, 0)调用返回的值是语言名称和以点分隔的代码页编号的组合。我们使用explode拆分这两个部分,然后使用cp为数字添加前缀,以iconv可以理解的形式获取代码页。

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

$mytime = iconv($codepage, 'utf-8', $mytime);