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

标签 c++ visual-c++

有没有办法在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/

相关文章:

c++ - OpenCV 3 中未在此范围内声明消息 "‘CV_SHAPE_ELLIPSE’

python - 命令在终端或程序(Python 和 C++)中给出不同的行为

c++ - 如何在 Boost.Spirit 语义 Action 中获得函数结果

c++ - 将我的服务器响应 char 数组转换为 wchar_t 数组是否是处理客户端收到的服务器消息的正确方法?

c++ - std::numeric_limits::max 语法错误

c++ - visual c++,没有编译器优化的数字代码给出错误的结果

c++ - Visual C++ 窗体、简单消息框和将文本从文本字段分配给字符串时出错

c++ - Qt C++语法?

c++ - boost::shared_ptr 类结束时出错

c++ - 在 VC++ 中确定未初始化的变量