Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php编码难题_Php_Html_Encoding_Html Parsing_Domdocument - Fatal编程技术网

php编码难题

php编码难题,php,html,encoding,html-parsing,domdocument,Php,Html,Encoding,Html Parsing,Domdocument,我正在从一个政府网站下载HTML文件(没有任何!DOCTYPE的原始HTML…),然后提取段落,将它们放入MySQL数据库 我正在使用DOMDocument,所以我要 $doc = DOMDocument(); $doc->loadHTMLFile( "../notifs/notif$notif_no.htm" ); 问题的出现是因为某些字符被转换成了奇怪的东西:例如(一种)撇号变成了™. 如果我尝试将这个段落保存到一个表中的文本字段中,要么被MySQL拒绝,要么被记录为这些奇怪的字符。

我正在从一个政府网站下载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文件,使默认的字符集为“utf-8”。没有快乐

我更多的是一个应用程序程序员,而不是一个网站的人,所以我对编码非常陌生。我自己也试过破解这个,但是我真的不明白到底发生了什么或者该怎么做

以后

我们发现

$file = file_get_contents("../notifs/notif$notif_no.htm");
$doc->loadHTML('<?xml encoding="UTF-8">' . $file );
在$clean_字符串之后,包含诸如“…葡萄酒值得饮用”之类的序列。。。但就我个人而言,我仍然会感到困惑,因为如果你只是去

echo ">>> clean string $clean_string<br>";
echo“>>>干净字符串$clean_字符串
”;
。。。当然,浏览器会将“序列”显示为“(单引号)

这可能是绝对明显的大多数PHPER。。。但是,如果您想显示$clean_字符串中所包含内容的准确图片,则必须执行以下操作

$decoded_clean_string = htmlspecialchars( $clean_string, ENT_QUOTES );
echo ">>> decoded string: $decoded_clean_string<br>";
$decoded\u clean\u string=htmlspecialchars($clean\u string,ENT\u引号);
echo“>>>解码字符串:$decoded_clean_string
”;
值得一试吗


这是unicode不匹配。e、 g.您正在获取一个utf-8文档,但在iso-8859中处理它。必须在整个渲染管道中维护相同的字符集,或者根据需要将其转换为“边框”。即使是作为应用程序程序员,您也需要了解编码@谢谢你的回复。我认为选择iso-8859的是DOMDocument loadHTMLFile方法,对吗?这种想法促使我尝试让PHP使用utf-8作为默认的字符集。你是说“在”边境。。。i、 在一个管道和另一个管道之间?边界应该是,比如说,php->mysql。mysql中的表可以使用utf-8格式,但除非db连接也设置为utf-8格式,否则从php->mysql运行时,文本将被破坏。@deceze相信我,我已经看到了该网页并阅读了它。这对我这里的特殊问题没有帮助。你能帮我解决这个特殊的PHP/MySQL编码问题吗?谢谢。。。不幸的是,两者都不起作用。第二个将模式更改为“欧元”™. 但php中似乎有各种编码函数可用。。。e、 g.iconv。。。所以,谢谢你指点方向,很可能再次发生意外。。。是的,你用HTML-ENTITIES让我走上了正确的轨道。。。见我上面的第二个“以后”哈。这就是你的探索之旅!:)我很高兴你弄明白了。
# convert difficult UTF-8 characters into HTML special sequences ("&rsquo;", etc.) 
$clean_string = mb_convert_encoding($clean_string, "HTML-ENTITIES", "UTF-8"); 
echo ">>> clean string $clean_string<br>";
$decoded_clean_string = htmlspecialchars( $clean_string, ENT_QUOTES );
echo ">>> decoded string: $decoded_clean_string<br>";
$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');