2012-03-23 55 views
1

我從一個數據庫獲得通過HTTP發佈或獲取一個unicode字符串(無所謂)寫的Unicode字符到PHP文件 - 而不是重複

在PHP我使用「mb_detect_encoding」檢查字符串的編碼結果得到了UTF-8。

因此,字符串是Unicode的。

但我怎麼寫的字符串從PHP與正確的編碼

$fd = fopen('myfile.php', "wb"); 
    fwrite($fd, $msg."\n"); 

我看到的是「टेसà¥à¤Ÿ」,而不是一個輸出文件實際的字符串,它是 電話

將'垃圾'粘貼到記事本++,然後從菜單選項'編碼UTF-8'將顯示正確的文本。

編輯 * SOLUTION *

對不起張貼的問題,並找出自己的答案。

我找到了解決方案可從以下網站 http://www.codingforums.com/showthread.php?t=129270

function writeUTF8File($filename,$content) { 
     $f=fopen($filename,"w"); 
     # Now UTF-8 - Add byte order mark 
     fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
     fwrite($f,$content); 
     fclose($f); 
} 

回答

0

您必須指定的mb_detect_encodingstrict參數,否則你會得到許多假陽性。

此外,雖然輸出可能是UTF-8,但您必須指定正確的標題(content-encoding)和/或charset元標記(如果它是HTML)。

+0

輸出是一個PHP文件的解決方案。我如何爲php文件指定標頭? – Anand 2012-03-23 08:03:57

+1

對不起,我誤解了。關於您自己發佈的解決方案:請注意,當您使用字節順序標記(BOM)啓動PHP文件時,包含PHP文件時也會輸出此BOM。這可能會導致在使用此生成的PHP文件呈現的頁面的開頭(或某處中間)輸出不需要的BOM。 – GolezTrol 2012-03-23 10:35:06

2

當您寫入文件時,PHP不會更改字符串的編碼或對其執行任何操作。它只是將字符串的字節(PHP字符串實際上是字節數組)存儲到文件period中。如果您實際接收到的字符串爲UTF-8,除非將其寫入文件,否則不要對其執行任何操作,該文件的內容將採用UTF-8編碼。您的問題很可能是您使用的任何應用程序視圖該文件沒有正確地將其讀爲UTF-8編碼。


BOM解決方案不一定是最好的。對於UTF-8,BOM不是必需的,許多應用程序都有問題。它只能幫助那些不能用 (太愚蠢) 來檢測文件是UTF-8編碼的應用程序。更好的解決方案可能是簡單地明確告訴相關應用程序,在打開文件時需要將文件視爲UTF-8編碼。或者使用更好的應用程序。

0

對不起,我發佈了這個問題並找出了答案。

我發現以下站點here

function writeUTF8File($filename,$content) { 
     $f=fopen($filename,"w"); 
     # Now UTF-8 - Add byte order mark 
     fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
     fwrite($f,$content); 
     fclose($f); 
} 
+0

「UTF-8 BOM」是假的;沒有字節順序來標記UTF-8。不幸的是,來自Microsoft Land的許多工具默認將UTF-8輸出中的仿BOM包括在內,並且在某些情況下不能讀取UTF-8輸入。您的原始文件已經是有效且正確的UTF-8;如果Notepad ++沒有默認將文件識別爲UTF-8,則應該更改該設置。 – bobince 2012-03-23 15:30:25