我正在从政府网站下载 HTML 文件(没有任何 !DOCTYPE...的原始 HTML),然后提取段落以将它们放入 MySQL 数据库。
我正在使用 DOMDocument,所以我要去
$doc = DOMDocument();
$doc->loadHTMLFile( "../notifs/notif$notif_no.htm" );
问题的出现是因为某些字符变成了奇怪的东西:例如(一种)撇号变成了¢€™。
如果我然后尝试将此参数保存到表中的文本字段中,要么被 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”检测到的编码。嗯嗯
之后
$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 之后包含诸如“......葡萄酒值得喝”之类的序列......但我,一方面,仍然很困惑,因为如果你只是去
echo ">>> clean string $clean_string<br>";
......“’” 序列当然会被浏览器显示为 ' (单引号)。
这对于大多数 PHPers 来说可能是绝对显而易见的......但是如果你想显示你在 $clean_string 中拥有的准确图片,你必须去
$decoded_clean_string = htmlspecialchars( $clean_string, ENT_QUOTES );
echo ">>> decoded string: $decoded_clean_string<br>";