PHP生成的XML显示无效的Char值27消息。

36

我正在使用以下PHP库生成XML:

$dom = new DOMDocument("1.0","utf-8");

执行上述操作会生成一个页面,该页面顶部显示一条消息。

此页面包含以下错误: 第16行第274505列出现错误:PCDATA无效的字符值27 下面是页面在第一次出错之前的呈现。

我尝试使用Tidy库进行修复...使用iconv将中文字符转换为UTF-8。


2
请添加一个最小的代码示例以重现错误。 - Tomalak
2个回答

110
一个有用的函数可用于解决此错误,在这个网站上提供了建议。 http://www.phpwact.org/php/i18n/charsets#common_problem_areas_with_utf-8
当您将 utf-8 编码的字符串放入 XML 文档时,应记住并非所有 utf-8 有效字符都被接受在 XML 文档中。 http://www.w3.org/TR/REC-xml/#charsets
因此,您应该去除不需要的字符,否则会出现类似上面的 XML 致命解析错误。
function utf8_for_xml($string)
{
    return preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $string);
}

希望这能为其他人节省一些时间。


非常感谢。我很惊讶php xml编写器本身不会做这些事情。 - Michal
1
以下是等效的 ruby 函数,供需要的人参考:sring.gsub(/[^\u{0009}\u{000a}\u{000d}\u{0020}-\u{D7FF}\u{E000}-\u{FFFD}]+/u, ' ') ... 或者更高效地,这也可以用以下方式实现:string.tr("^\u{0009}\u{000a}\u{000d}\u{0020}-\u{D7FF}\u{E000}-\u{FFFD}", ' ') - Tom Lord
非常感谢你,Prashant! - ijpatricio
4
太棒了。我发现我已经点过赞了。我想再给你一个赞。 - Michal
因此我浪费了两天时间。非常感谢! - Supun Kavinda
对我来说,这个函数返回了NULL。可能是因为输入不是UTF-8编码的。不确定输入是什么... - Wouter

7

Prashant说得完全正确。你也可以通过以下方式在Javascript中去除无效字符:

function utf8_for_xml(inputStr) {
  return inputStr.replace(/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm, '');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接