【问题标题】:removing Invalid UTF-8 character - 0xfffe in PHP删除无效的 UTF-8 字符 - PHP 中的 0xfffe
【发布时间】:2012-01-21 10:19:33
【问题描述】:

任何想法如何通过 PHP 函数摆脱字符串中的 0xfffe 字符?

这样可以吗? preg_replace('/[\x{fffe}-\x{ffff}]/u', '', $string)?

【问题讨论】:

    标签: php utf-8 pcre


    【解决方案1】:

    好的,只是为了让您知道preg_replace('/[\x{fffe}-\x{ffff}]/u', '', $string) 成功了。

    【讨论】:

      【解决方案2】:

      注意:0xFFFE(错误,见下面的编辑——实际上是0xFEFF)通常用作所谓的字节顺序标记,这是一个可选的东西在文件的开头(并且只有那里!),表示内容的字节顺序。它通常包含在诸如 XML 文件之类的内容中。 因此,可能只考虑以该值开头的内容的大小写,而不必担心其余部分。

      编辑:正如评论所指出的,它是用作 BOM 的 0xFEFF(有关更多信息,请参见 wikipedia),而不是 0xFFFE。因此,如果它是预期的 BOM,它要么被破坏,要么解码器假定错误的顺序(UTF-16 BE vs LE)。但更有可能将其用作无效字符标记;如果是这样,原来的问题更有意义。唯一的额外建议是,提供此类内容的人可能使用了过于有限的编码(ascii、latin-1),理想情况下该服务应该是固定的,而不是必须在客户端处理这个问题。

      【讨论】:

      • 字符 U+FFFE 是非字符,在传输的文本中是非法的,但可以在程序内部使用,因为它不是有效字符。在给定的编码中,无论字节将被编码为 U+FEFF 都被用作 BOM,因为如果它以相反的方式解释,它将是 U+FFFE,这是非法的,因此可能永远不会正确。
      • 是的。我知道它被选为 BOM 的原因,只是建议可能有一个泄漏;如果是这样,它必须在任何内容之前。
      • 啊!不知何故,设法误读了相同的代码……因此造成了混乱。虽然它可能只是对 UTF-16 的错误解码,但更有可能将其用作无效字符的指示符(Java 编解码器通常将其用于字符超出范围的情况,例如尝试对 ASCII/Latin-1 范围之外的字符进行编码)
      • 没有错……FEFF表示BE,FFFE表示LE。 "反之,如果前两个字节是0xFF、0xFE,那么可以假定文本流编码为UTF-16LE"
      猜你喜欢
      • 2013-12-22
      • 2011-05-12
      • 2011-02-09
      • 2010-11-28
      • 2014-02-12
      • 2017-04-16
      • 2012-05-02
      • 2015-03-12
      • 2023-03-23
      相关资源
      最近更新 更多