gpt4 book ai didi

c++ - 有没有办法检查一个字符串是否包含 C++ 中的 unicode 字符

转载 作者:行者123 更新时间:2023-11-30 01:50:20 28 4
gpt4 key购买 nike

有没有办法在C++中检查一个字符串是否包含unicode字符

我有一个字符串,我需要验证它是否包含 unicode(UTF-8 或 UTF-16)字符。如果是这样,我需要将它们转换为 ASCII。我对转换逻辑有一些想法,但需要一些帮助来检测字符串中的 unicode 字符

最佳答案

没有 100% 保证的解决方案。我将从阅读前 100 个开始左右字节,并尝试确定编码:

  • 如果文件以三个字节序列 0xEF、0xBB、0xBF 开头,则可能是UTF-8。在这种情况下,丢弃这三个,并将其余的处理为UTF-8,如下。

  • 如果文件以两个字节序列 0xFE、0xFF 开头,则可能是UTF16BE。删除这两个,并将其余的处理为 UTF16BE,如下所示。

  • 如果文件以两个字节序列 0xFF、0xFE 开头,则可能是 UTF16LE。丢掉这两个,剩下的处理成UTF16LE,下面。

  • 如果从第一个字节开始,每隔一个字节大部分都是 0,那么文件可能是 UTF16BE。 (多少主要取决于;取决于数据来源,甚至超过一对就足够了。)处理为 UTF16BE,如下所示。

  • 如果每隔一个字节,从第二个开始,大部分都是 0,那么它是可能是 UTF16LE(在 Windows 世界中很常见)。

  • 否则,这是任何人的猜测,但处理它就好像它是 UTF-8(不丢弃任何字节)可能是可以接受的。

关于如何处理文件:

  • 对于 UTF-8,只需检查所有剩余字节是否在范围内[0,128]。如果不是,则文件无法转换为 ASCII。如果他们是,文件 ASCII(以及UTF-8)。这也是有效的对于大多数单字节编码,例如所有 ISO-8859 编码(仍然很普遍)。

  • 对于 UTF16BE,每隔一个字节,从第一个开始,应该是 0,并且[0,128] 范围内的剩余字节。如果不是,则文件不能转换为 ASCII。如果是,则每隔一个字节取一个字节,从第二个。

  • 对于 UTF16LE,每隔一个字节,从第二个开始,应该是 0,以及 [0,128) 范围内的剩余字节。如果不是,则文件无法转换为 ASCII。如果是,每隔一个字节,从头开始。

在所有情况下,此处理从第一步。

最后,你没有说出你想做什么。有编码允许以纯形式表示所有 Unicode 字符的约定编码;如果您生成的 ASCII 将由期望一个的代码处理这些约定,那么你将不得不处理完整的 Unicode(包括 UTF-16 中的代理对)并将 Unicode 转换为目标程序期望的任何编码。 C++,例如,期望通用字符名称; é 的表示,对于例如,将是 \u00E9。这意味着您还必须转换 \\\。 (据我所知,这个约定只适用于编程语言,如 C、C++ 和 Java。)

关于c++ - 有没有办法检查一个字符串是否包含 C++ 中的 unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27522421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com