2016-03-07 55 views
9

爲什麼這會返回一個服務器上的utf8字符而不是另一個服務器上?一些文件名包含unicode字符像æøå ..opendir和readdir返回utf8

在某些環境UTF8字符被印刷,並且在一些異字符被印刷

header('content-type: text/plain'); 
$handle = opendir("./dir"); 
while($readdir = readdir($handle)){ 
    echo "$readdir\n"; 
} 

輸出Content-Type:text/plain;charset=UTF-8

Retursvar 2 med fejl p� debiteringsniveau.xml 
Retursvar 2 med fejl på debiteringsniveau.xml 

相同的語言環境(UTF8)

dpkg-reconfigure locales 
+0

什麼底層的文件系統是在使用?在服務器上使用的文件系統是否與返回不同的結果相同? –

+0

所有系統都是Debian Jessie - 相同的發行版 – clarkk

+0

好的,下一個問題 - 你如何設置內容類型。我假設你通過網絡服務器運行並在瀏覽器中查看?是通過'header()'還是內聯html設置內容類型? –

回答

0

這不是PHP的問題,這是一個系統問題。這個問題可能源於其中一個系統上配置錯誤的語言環境。如果運行locale,則可以檢查當前安裝的語言環境。如果區域設置未標記爲UTF-8,這將是您的問題。安裝正確的UTF-8語言環境將解決該問題。

+0

兩個系統上都安裝了完全相同的語言環境。UTF8 – clarkk

2

您可能發現您的Web服務器在每個系統上以不同的語言環境運行。

爲了確定這一點通過你的服務器運行下面的PHP:

<?php 
system("locale"); 

機會是Web服務器返回正確的字符或者是「utf-8」區域或「C」運行。

網絡服務器使用的語言環境可以在不同的地方設置。通過使用系統範圍的區域設置 - 或者特定的服務。您可能需要調查任何差異的原因,並決定是更新系統範圍的區域設置還是僅更新Web服務器。

在Debian中,全系統區域設置更改使用

dpkg-reconfigure locales 

並按照提示進行更改。

或者,對於特定於服務的區域設置。在啓動服務之前,將'LANG'環境變量設置爲您在服務初始化腳本中所需的環境變量。可能還有一個特定於服務的配置文件,您也可以搜索以在發生網絡服務器升級時堅持更改。

+0

兩個系統上都安裝了完全相同的語言環境。UTF8 – clarkk

+0

澄清 - 系統語言環境可能與Web服務器或任何其他進程不同跑下。您使用什麼方法來確定這兩個Web服務器都以UTF-8運行? –

-1

嘗試設置UTF-8編碼在你的頭:

header('content-type: text/plain; charset:utf-8');