2012-02-17 66 views
1

我有一個表單,表單輸入不是英語語言。
當點擊提交按鈕時,我正在使用POST方法獲取字符串。現在我想在一個名爲'translate.php'的新文件中編寫字符串。如果我用fwrite的工作正確的英語,但其他語言如「保加利亞」會寫這樣1НАЧАЛО 實際字的Unicode標準EN:首頁
在保加利亞:Н А Ч А Л О。
我可以寫英文,但我不能寫在保加利亞使用fwrite。
請任何人都可以幫助我。如何在PHP中使用fwrite編寫保加利亞字符

回答

1

這不是fwrite這是變換你的字符,這些是HTML實體,而不是Unicode。我猜你的網站的編碼設置爲Latin-1。這意味着瀏覽器會將輸入的數據提交到以拉丁文-1編碼的服務器中。保加利亞語不在Latin-1範圍內,因此不能編碼,因此瀏覽器會將這些字符編碼爲HTML實體。

兩個解決方案:

  1. 使用html_entity_decode($str, ENT_COMPAT, 'UTF-8')的形式,因此在解碼的HTML實體實際UTF-8
  2. (首選)爲你的網站在UTF-8和/或設置accept-charset="utf-8"屬性瀏覽器將向服務器提交UTF-8數據

要深入研究,請參閱Handling Unicode in a Webapp

+0

哇!謝謝你,偉大的人。 – yogi46 2012-02-17 07:08:57

+2

@ yogi46:如果這對你有效,你應該接受答案。 – 2012-07-12 10:56:48

0

我不知道你的代碼是什麼樣子,但你可以嘗試:

.... 
$string = utf8_encode($posted_string); 
$f = fopen('/path/to/translate.php',"w"); 
fwrite($f, $string); 
fclose($f); 
.... 
+0

'utf8_encode'將Latin-1編碼的字符串轉換爲UTF-8。除非要將Latin-1編碼的文本轉換爲UTF-8編碼的文本,否則這根本沒有用。 – deceze 2012-02-17 07:36:42

+0

是的,多數民衆贊成在想法..因爲我認爲網站編碼設置爲拉丁-1。 – mlinuxgada 2012-02-17 07:39:03

+0

但拉丁-1不能編碼保加利亞字符開始... – deceze 2012-02-17 07:40:51

1

不知道這是不是你的情況,但是當你需要UTF8內容的文件在其他應用程序,它具有包含標題爲UTF8文件的標題。

我使用下面的代碼寫入文件並將其作爲下載文件提供給瀏覽器。見線以下add UTF-8 byte order mark

header('Content-type: text/plain; charset=utf-8'); 
header('Content-Disposition: attachment; filename="UTF8 encoded file.sql"'); 
$f= fopen('php://output', 'w'); 
// add UTF-8 byte order mark 
fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
fwrite($f, $fileOutput); 
fclose($f); 

同樣,這只是要心目中如果當前寫入文件不能按預期工作的方法(你沒有張貼的代碼)。

+0

對於UTF-8,BOM不*「*需要」。它是可選的,一些軟件期望它,其他支持它,而其他*失敗*如果存在BOM。安全的選擇是*不*包含BOM,只有在需要打開文件的應用程序需要BOM(主要是MS程序)時才包含它。 – deceze 2012-02-17 08:15:14

+0

是的,你是對的。這裏可能不是這種情況,因爲他寫入的文件是'translate.php',可能只包含在其他的php腳本中。 – talereader 2012-02-17 08:21:51