【问题标题】:Mojibake issue in XML retrieved over cURL通过 cURL 检索到的 XML 中的 Mojibake 问题
【发布时间】:2023-03-30 02:37:02
【问题描述】:

我正在通过 PHP cURL 检索 this XML feed 并将其输出到我页面上的文本区域中。问题是,它回来时充满了 mojibake 角色。饲料本身很好;只有在我的页面上输出时才会出现字符。

例如,英镑符号 (£) 将返回为 £。

按照this question 的回答中的建议,我已尝试在该问题上使用 UTF-8。

ini_set('default_charset', 'UTF-8');
header("Content-Type:text/html; charset=UTF-8");

在 HTML 中:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

甚至通过 utf8_encode() 输出 cURL 响应,但它们仍然存在。

$ch = curl_init($feed_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec($ch);
echo '<textarea>'.utf8_encode($xml).'</textarea>';

我什至尝试将这些字符换掉,但这并没有成功。

$xml = strtr($xml, array('£' => ''));

我在这里无能为力,还是有什么我可以做的?

【问题讨论】:

标签: php xml curl encoding mojibake


【解决方案1】:

在 HTML 页面中显示 XML 内容之前使用 htmlentities (http://php.net/manual/en/function.htmlentities.php),还要在该调用中将 $ch 更改为 $xml,因此:

echo '<textarea>'.htmlentities($xml).'</textarea>';

【讨论】:

  • 谢谢,但这会导致 XML 无法解析,因为它将 &amp;lt; 转换为 &amp;lt;
  • 在文本区域显示和解析是不一样的...如果要解析需要对未修改的内容使用PHP XML解析器
【解决方案2】:

utf8_encode() 会将输入视为 latin-1 并将其转换为 utf-8。如果输入是 utf-8,这将是双重编码 - 这就是您所看到的。

检查您从 URL 获取的 XML 字符串。 XML文件的编码通常在XML处理指令中:

<?xml version="1.0" encoding="utf-8"?>
<document-element/> 

加载到 DOM、XMLReader 或 SimpleXML 中时,它将始终转换为 UTF-8。您使用 API 读取的任何值都是 UTF-8。

如果您想将 UTF-8 XML 输出到 HTML 页面的文本区域,您需要转义特殊字符。

echo '<textarea>'.htmlspecialchars($xml).'</textarea>';

这将转义&amp;lt; 和&gt; 等字符,但这是必需的。想象一下包含字符串&lt;/textarea&gt; 的XML。这会破坏您的 HTML 页面。浏览器将在显示 &amp;lt; 和其他实体之前对其进行解码。

【讨论】:

  • 谢谢,我会进一步探索。
猜你喜欢
  • 2020-08-14
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多