【发布时间】:2011-05-12 13:38:47
【问题描述】:
我有一个大文件,所以我创建了一个过滤器,用于从 XML 中删除无效的 utf-8 字符。
class ValidUTF8XMLFilter extends php_user_filter {
protected static $pattern = '/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})|./x';
function filter($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = preg_replace(self::$pattern, '$1', $bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
此过滤器还将删除 utf-8 字符,不仅在 xml 中无效,而且在 utf-8 中。 正则表达式取自Multilingual form encoding。该课程取自以下答案:How to skip invalid characters in XML file using PHP 并重写。该答案中的模式不适用于无效的 utf-8 字符,例如。 0x1D。
在无效字节从缓冲区末尾开始并在下一次过滤开始时结束的情况下,此过滤器是否有效?这种情况可能吗?
【问题讨论】:
-
你想做什么?您是在尝试去除格式错误的 UTF-8 子序列(通常这是一个坏主意,您应该用替换字符替换它们,但这是另一个主题)还是您想对有效的 UTF-8 序列进行操作但删除字符在 XML 中是非法的(例如大多数 C0 控制代码)?
-
我想去除格式错误的 UTF-8 usbsequences并删除 XML 中的非法字符。
-
你是如何得到一个不是 UTF-8 文件的 UTF-8 文件的?停在那里,重新考虑你的给定。它们没有任何意义。
标签: php xml utf-8 character-encoding