2013-06-21 42 views
0

我正在嘗試使用Drupal 6生成多語言。我的網站託管在Windows IIS 7.5服務器上。Dreaded ????顯示中文文字時不是字符。簡體中文字符問題

我已經上傳了我的.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 ??

有關如何解決此問題的任何想法?

+0

哪裏像不像呢?在控制檯上?在網頁上?在數據庫中? –

+0

我的猜測是在一個網頁上,並且包含'header('Content-Type:text/html; charset = utf-8')'的標準修正;'在文檔的頂部可能會解決它...可能;) – CD001

+0

上面給出的結果顯示在網站上。我添加了一個回聲聲明,使其更清楚。 charset設置爲utf-8。我應該補充的是,頁面的其餘部分完全顯示在中文文本中,它只是由strftime返回的日期顯示爲問號 –

回答

3

第一個問題是設置LC_TIME類別本身是不夠的。 strftime函數會嘗試以適當的語言格式化時間,但它似乎默認使用1252代碼頁,所以它不能爲中文之類的東西生成必要的字符。

我本來預計設置LC_TIME或者LC_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); 
+0

我不得不說,這是一個完整的,內容豐富的答案,就像我在這個網站上收到的。非常感謝您的時間和精力! –