2010-11-14 54 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