2010-11-14 92 views
7

我得到一個文件充滿了這些代碼,我想「翻譯」到正常的字符(我的意思是一個完整的文件)。我該怎麼做?Ã ©和其他代碼

非常感謝您提前。

+0

你究竟是什麼意思?你在十六進制編輯器中打開文件時看到了什麼? – 2010-11-14 14:02:07

+0

對不起,我的不好解釋。我的意思是,使用PHP的utf8_decode()函數可以顯示實際值,但我需要將其更改爲整個文件。怎麼做? – Matts 2010-11-14 14:03:10

回答

16

看起來你最初有一個被解釋爲8位編碼(例如ISO-8859-15)和實體編碼的UTF-8文件。我這樣說是因爲序列C3A9看起來像一個相當可信的UTF-8 encoding sequence

您需要先對其進行實體解碼,然後再次使用UTF-8編碼。然後你可以使用類似iconv的東西來轉換爲你選擇的編碼。

要通過你的工作,例如:

  • Ã ©將被解碼爲字節序列0xC3A9
  • 0xC3A9 = 11000011 10101001二進制
  • 在第一個八位字節中的前導110告訴我們這可能被解釋爲一個UTF-8兩字節序列。由於第二個八位字節以10開頭,我們正在尋找一些我們可以解釋爲UTF-8的東西。要做到這一點,我們採取的第一個字節的最後5位,第二個字節的最後6位...
  • 因此,解釋爲UTF8這是00011101001 = E9 = E(LATIN SMALL LETTER E WITH ACUTE

你提到想用PHP來處理這個問題,像這樣的東西可能會爲你做:

//to load from a file, use 
//$file=file_get_contents("/path/to/filename.txt"); 
//example below uses a literal string to demonstrate technique... 

$file="&Précédent is a French word"; 
$utf8=html_entity_decode($file); 
$iso8859=utf8_decode($utf8); 

//$utf8 contains "Précédent is a French word" in UTF-8 
//$iso8859 contains "Précédent is a French word" in ISO-8859 
+0

+1很好的答案。 – Sarfraz 2010-11-14 14:28:18

+0

但如何更改整個文件?我的意思是,這是一個帶有「常見」文本和編碼序列的文件... – Matts 2010-11-14 14:31:07

+0

如果這種技術不適用於您的文件,我建議包括一個相關的文件樣本的小十六進制轉儲。 – 2010-11-14 14:33:46