2015-11-19 31 views
4

我無法弄清楚我做錯了什麼。我從數據庫中獲取文件內容。當我回應內容時,當我將它寫入文件(.html)時,所有內容都顯示得很好。我已經嘗試過iconv和其他一些解決方案,但我不明白我應該爲第一個參數放置什麼,我嘗試過空格,而且這種方法也不能很好地工作。如果它正確回顯,我認爲它以UTF-8的形式出現。現在卡住了一會兒,沒有多少運氣。通過PHP的fwrite寫入UTF-8文件

function file($fileName, $content) { 
    if (!file_exists("out/".$fileName)) { 
     $file_handle = fopen(DOCROOT . "out/".$fileName, "wb") or die("can't open file"); 
     fwrite($file_handle, iconv('UTF-8', 'UTF-8', $content)); 
     fclose($file_handle); 
     return TRUE; 
    } else { 
     return FALSE; 
    } 
} 

html文件的來源看起來像。

出來的DB是這樣的:

<h5>Текущая стабильная версия CMS</h5> 

進去文件中像這樣

<h5>Ð¢ÐµÐºÑƒÑ‰Ð°Ñ ÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ CMS</h5> 

編輯:

原來,問題的根源是Apache的服務於文件不正確。添加

AddDefaultCharset utf-8 

我的.htaccess文件修復了它。浪費時間......至少我學到了一些東西。

+0

將您的輸出HTML放在某處。您可能沒有將UTF-8 標籤標頭添加到HTML中。 – Dean

+0

@ Dean即使在看源代碼時也會這麼做嗎?

  • DD°N「орумÐμчd°ÑÑ,оупоминаÐμÑ,ÑÑкоÐ'огÐμнÐμÑ€d°Ñ,ор。
  • Serhiy

    +0

    @Serhiy您可以在原始文章底部的評論中添加代碼嗎?評論代碼/爭奪是很難在最好的時間閱讀,歡呼 – Martin

    回答

    0

    Dean的評論其實非常重要。該HTML應在<head>內有<meta charset="UTF-8">

    iconv呼叫實際上是沒有用的,如果你是對的,你是讓你的內容爲UTF-8,這是沒有必要的。

    您應該檢查數據庫連接的字符集。您的數據庫可以使用UTF-8編碼,但連接可能位於另一個字符集中。

    祝你好運!

    +0

    瀏覽器應該檢測到沒有meta的UTF-8,這不是*必需的*要求。我認爲問題在於數據庫編碼。 – Martin

    +0

    是的,我覺得Dean的評論是一個切線。該文件是壞的,當我在文本編輯器中打開它時,不需要瀏覽器。 – Serhiy

    +1

    @Serhiy我認爲這是你的問題上的'b'inary標記。查看我的回答(底部) – Martin

    1

    編輯:數據庫編碼似乎並沒有成爲這裏的問題,所以回答的這部分被保留僅供

    我以爲它走出DB爲UTF-8

    這很可能是您的問題,您使用哪種數據庫類型?您是否設置了數據庫的字符編碼和歸類細節,表格,連接的轉移。

    如果我冒險猜測,我會說你的表是MySQL,並且你的數據庫/表/列的MySQL整理應該都是UTF8_general_ci

    但是,由於某些原因,MySQL UTF8實際上並不是UTF8,因爲它將數據存儲在3位而不是4位,所以不能存儲整個UTF-8字符集,請參閱UTF-8 all the way through

    所以你需要通過每個表,列上你的MySQL,它從UTF8_更改爲UTF8mb4_(注:由於的MySQL 5.5.3),這是UTF8_multibyte_4覆蓋字符的全UTF-8譜。

    此外,如果您對數據字符串做任何PHP工作,請注意您應該使用mb_ PHP函數進行多字節編碼。

    最後,你需要指定一個連接字符設置數據庫,不使用默認的一個運行,因爲它幾乎肯定會是UTF8mb4,因此你可以在數據庫中有正確的數據,但之後數據被重新打包爲3位UTF8,然後在另一端被PHP視爲4位UTF8。

    希望這有幫助,如果你的數據庫不是MySQL,讓我們知道它是什麼!

    編輯:

    function file($fileName, $content) { 
        if (!file_exists("out/".$fileName)) { 
         $file_handle = fopen(DOCROOT . "out/".$fileName, "wb") or die("can't open file"); 
         fwrite($file_handle, iconv('UTF-8', 'UTF-8', $content)); 
         fclose($file_handle); 
         return TRUE; 
        } else { 
         return FALSE; 
        } 
    } 
    
    • $file_handle試圖打開一個if聲明如果文件不存在,這將只運行中的一個文件。

    • 您的iconv在這裏毫無價值,從「utf-8」轉變爲「utf-8」。字符檢測非常隨意,程序難以正確做到,所以一般建議不要嘗試和工作/什麼是字符編碼它,你需要知道它是什麼,告訴函數它是什麼。

    +0

    Arg仍然失敗,將表/連接切換爲UTF8mb4,重新插入數據以確保註釋掉str_replace,以防萬一,取出iconv,使「wb」變成「w」,但仍然失敗。 – Serhiy

    +0

    你需要檢查PHP和MySQL之間的連接是否也是utf8mb4,類似'$ dbconnection-> set_charset(「utf8mb4」);' – Martin

    +0

    如果這對你沒有幫助,那麼我們需要看看代碼看起來像你的屏幕輸出(當它是好的),並將其與你的文件(你已經放在你的問題中)看起來像什麼。此外,如果您已將數據庫更改爲使用UTF8mb4,則理想情況下需要將代碼重新添加到數據庫,以便將其保存爲4位而不是3位UTF8。 @Serhiy – Martin