【问题标题】:Check if a char* buffer contains UTF8 characters?检查 char* 缓冲区是否包含 UTF8 字符?
【发布时间】:2010-11-16 22:38:13
【问题描述】:

在没有 BOM 的情况下,是否有一种快速而肮脏的方法可以检查 char* 缓冲区是否包含 UTF8 字符?

【问题讨论】:

    标签: c++ c utf-8


    【解决方案1】:

    不可靠。有关该主题,请参阅 Raymond Chen 的 seriesposts

    问题在于,没有 BOM 的 UTF-8 通常与同样有效的 ANSI 编码无法区分。我认为大多数解决方案(如 win32 API IsTextUnicode)使用各种启发式方法来对文本格式进行最佳猜测。

    【讨论】:

    • 使用 BOM 仍然无法区分。因此,BOM 除了有害之外毫无用处。
    【解决方案2】:

    您可以测试它可以测试的假设,但我相信您最终只能确定它不能确定。换句话说,您可以检查缓冲区以查看是否所有字节序列都是合法的 UTF-8、代码点是否用最少的字节数表示、是否不存在 16 位代理代码等等。通过所有这些标准的缓冲区可能看起来是文本,但您可能会被愚弄。

    除了 Mark Pim 的回答引用的旧新事物中 Raymond Chen 的讨论之外,缓冲区实际上可能包含 x86 机器代码,而这些代码恰好被限制为似乎是 7 位可打印 ASCII 的子集。令人惊讶的是,您实际上可以在该子集中编写有意义的程序,其中一个例子是 EICAR 防病毒测试病毒。

    当然,包含格式错误的 UTF-8 字节序列的缓冲区可能根本就不是 UTF-8 文本。在这种情况下,你有很高的信心。然后诀窍是弄清楚它实际上可能是什么编码。

    如果您知道(或可以假设)缓冲区的语义内容,那么您也可以使用它来支持您的决定。例如,如果缓冲区应该包含英文文本,那么其中极不可能有来自韩语的代码点,并且通常应该拼写正确,遵循英文语法等等。当然,这可能会使测试变得昂贵......

    【讨论】:

      【解决方案3】:

      为了快速和肮脏,你不能比this page 上的正则表达式做得更好。如果您只想知道将字节解码为 UTF-8 是否安全,这就是您所需要的。

      【讨论】:

        【解决方案4】:

        只需测试字节序列作为 UTF-8 是否有效。如果是,它在任何其他编码中成为有意义文本的概率基本上为零。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-16
          • 2017-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-09
          • 2013-10-26
          • 1970-01-01
          相关资源
          最近更新 更多