【问题标题】:PHP: removing invalid utf-8 characters in XML using filterPHP:使用过滤器删除 XML 中的无效 utf-8 字符
【发布时间】: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


【解决方案1】:

不,我认为它不会起作用。它将剥离恰好在多个存储桶之间拆分的有效代码单元序列。

它最终不应消耗可能不完整的序列(并且,如有必要,它不应传递任何内容并返回 PSFS_FEED_ME)。

【讨论】:

  • 问题是,很难找到合适的正则表达式来找到这种情况。第二件事是,你说过,它将去除有效的代码序列。有没有可能,它不会去除非法的代码序列?
  • @pro 不,它不可能不去除非法序列,因为非法序列在分离时永远不会成为合法序列。原因是 Unicode 规范要求有效的前导字节(或 ascii 范围内的字节)永远不会被视为非法序列的一部分。
  • @pro 我不建议您使用正则表达式。 unicode 规范的表 3-7 将在这里为您提供帮助:unicode.org/versions/Unicode6.0.0/ch03.pdf
猜你喜欢
  • 2012-01-21
  • 2013-12-22
  • 2011-03-14
  • 2011-02-21
  • 2011-02-09
  • 2015-03-12
  • 2015-05-12
  • 2010-11-28
  • 1970-01-01
相关资源
最近更新 更多