php编码拼图

时间:2012-11-14 19:16:08

标签: php html encoding html-parsing domdocument

我从政府网站下载HTML文件(原始HTML,没有任何!DOCTYPE ......),然后提取段落将它们放入MySQL数据库。

我正在使用DOMDocument,所以我要去

$doc = DOMDocument();
$doc->loadHTMLFile( "../notifs/notif$notif_no.htm" );

问题出现是因为某些角色变成了奇怪的东西:例如: (一种)撇号变为¢。

如果我然后尝试将此para保存到表格中的文本字段,则它会被MySQL拒绝或者被记录为这些奇怪的字符...取决于文本字段的编码。

另外,如果我去$ doc-> saveHTMLFile(“test.htm”);它实际上打印出奇怪的字符,而不是撇号。

我知道这与编码有关,但几天谷歌搜索和很多关于SE的问题并没有导致解决方案。 Firefox告诉我下载的HTML文件采用utf-8编码。我尝试更改php.ini文件,因此default_charset为“utf-8”。没有快乐。

我更像是一个应用程序员,而不是网站的人,所以我对编码很新。我自己试过破解这个,但只是不明白发生了什么或做了什么。

发现

$file = file_get_contents("../notifs/notif$notif_no.htm");
$doc->loadHTML('<?xml encoding="UTF-8">' . $file );

然后saveHTMLFile()输出正确的撇号...我的回声是SQL INSERT INTO ...(...)VALUES(...)字符串。然而,MySQL文本字段中的文本顽固地拒绝合作。 (自然而然地尝试了多种不同的校对)。同时,mb_detect_encoding($ clean_string)打印“UTF-8”,mb_check_encoding($ clean_string)返回TRUE。

另一个令人费解的事情是:如果我做了

$doc->loadHTML('<?xml encoding="latin1">' . $file )

同样的部分成功保持不变,直到检测到“UTF-8”编码。 hmmmm

$doc = new DOMDocument();
$file = file_get_contents("../notifs/notif$notif_no.htm");
# without this following line adding an explicit encoding for the DOMDocument nothing worked!
$doc->loadHTML('<?xml encoding="UTF-8">' . $file );

然后,当你提取了一些文本并将其清理干净时,调用它为$ clean_string

# convert difficult UTF-8 characters into HTML special sequences ("&rsquo;", etc.) 
$clean_string = mb_convert_encoding($clean_string, "HTML-ENTITIES", "UTF-8"); 

在此之后,$ clean_string包含诸如“... wine&amp; rsquo; s值得喝酒”之类的序列......但是,对于其中一个,我仍然会非常困惑,因为如果你只是去

echo ">>> clean string $clean_string<br>";

......“&amp; rsquo;”序列当然会被浏览器显示为'(单引号)。

对于大多数PHP用户来说这可能是绝对明显的...但如果你想要显示你在$ clean_string中所拥有的内容的准确图片,你必须去

$decoded_clean_string = htmlspecialchars( $clean_string, ENT_QUOTES );
echo ">>> decoded string: $decoded_clean_string<br>";

1 个答案:

答案 0 :(得分:1)

$doc = DOMDocument();
$file = file_get_contents("../notifs/notif$notif_no.htm");
$file = mb_convert_encoding($file, "UTF-8");
$doc->loadHTML( $file );

值得一试?

$file = mb_convert_encoding($file, 'HTML-ENTITIES', 'UTF-8');