我从政府网站下载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 ("’", 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>";
答案 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');