【问题标题】:Working with HTML econding in PHP (intelligent way to decode)在 PHP 中使用 HTML 编码(智能解码方式)
【发布时间】:2011-03-30 02:19:00
【问题描述】:

我正在从 PHP 脚本下载 RSS 提要,例如:

$fp = fopen('http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss','r') 
 or die('Error reading RSS data.'); 

该提要是西班牙新闻提要,在我下载文件后,我将所有信息解析到一个变量中,该变量仅包含每个 <item> 的标签 <description> 的内容。好吧,问题是当我回显 var 时,所有信息都有一个 html 结尾,例如:

echo($result); // 此印刷品: el Ministerio pãºblicoinvestigarã¡ la publicaciã³n en la primea pã¡gina

好吧,我可以创建一个巨大的案例实例,搜索每个字符可以将其更改为对应的字符,例如:ã¡ for Á 等等,但是没有办法用一个函数来做到这一点???或者更好的是,没有办法在没有 html 编码的情况下将内容下载到 $fp?谢谢!

实际代码:

<?php
$acumula="";
$insideitem = false; 
$tag = ''; 
$title = ''; 
$description = ''; 
$link = ''; 

function startElement($parser, $name, $attrs) { 
 global $insideitem, $tag, $title, $description, $link; 
 if ($insideitem) { 
  $tag = $name; 
 } elseif ($name == 'ITEM') { 
  $insideitem = true; 
 } 
} 




function endElement($parser, $name) { 
 global $insideitem, $tag, $title, $description, $link, $acumula; 
 if ($name == 'ITEM') { 
  $acumula = $acumula . (trim($title)) . "<br>" . (trim($description)); 
  $title = ''; 
  $description = ''; 
  $link = ''; 
  $insideitem = false; 
 } 
} 

function characterData($parser, $data) { 
 global $insideitem, $tag, $title, $description, $link; 
 if ($insideitem) { 
 switch ($tag) { 
  case 'TITLE': 
  $title .= $data; 
  break; 
  case 'DESCRIPTION': 
  $description .= $data; 
  break; 
  case 'LINK': 
  $link .= $data; 
  break; 
 } 
 } 
} 

$xml_parser = xml_parser_create(); 
xml_set_element_handler($xml_parser, 'startElement', 'endElement'); 
xml_set_character_data_handler($xml_parser, "characterData"); 
$fp = fopen('http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss','r') 
or die('Error reading RSS data.'); 
while ($data = fread($fp, 4096)) { 
 xml_parse($xml_parser, $data, feof($fp)) 
  or die(sprintf('XML error: %s at line %d', 
 xml_error_string(xml_get_error_code($xml_parser)), 
 xml_get_current_line_number($xml_parser))); 
} 
//echo $acumula;
fclose($fp); 
xml_parser_free($xml_parser); 
echo($acumula); // THIS IS $RESULT!
?>

【问题讨论】:

  • 您想对这次转换做什么?这是编码字符串转换?

标签: php html encoding decoding


【解决方案1】:

编辑

由于您已经在使用 XML 解析器,因此可以保证编码是 UTF-8。

如果您的页面是用 ISO-8859-1 甚至 ASCII 编码的,您可以这样做来转换:

$result = mb_convert_encoding($result, "HTML-ENTITIES", "UTF-8");

使用为您处理此问题的库,例如DOM extension 或 SimpleXML。示例:

$d = new DOMDocument();
$d->load('http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss');
//now all the data you get will be encoded in UTF-8

SimpleXML 为例:

$url = 'http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss';
if ($sxml = simplexml_load_file($url)) {
    echo htmlspecialchars($sxml->channel->title); //UTF-8
}

【讨论】:

  • 我怎样才能使这个新代码与我的旧代码兼容?检查问题,我编辑了。
  • @Dom 您发布的代码没有显示您如何获得$result
  • 是的,我用你发布的代码实现了,但我仍然得到编码字符,这里是代码:maracay.dyndns.org/contar/code.txt,这里是页面maracay.dyndns.org/contar/index.php
  • @Dom 在这里部分使用 ISO-8859-1 编码:codepad.viper-7.com/0HCLc3 如果您不进行转换,则会出现更多错误情况(请参阅此codepad.viper-7.com/CKIaPD)。似乎问题在于 RSS 提要本身已损坏(具有混合编码)。您对此无能为力。
【解决方案2】:

您可以使用PHP 中的DOMDocument 去除HTML 编码标签。 并使用PHP 中的编码转换函数来更改此字符串的编码。

【讨论】:

猜你喜欢
  • 2010-11-16
  • 2011-01-21
  • 2011-05-18
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多