有没有办法检查字符串是否包含C ++中的unicode字符
我有一个字符串,我需要验证它是否包含unicode(UTF-8或UTF-16)字符。如果是的话,我需要将它们转换为ASCII。 我对转换逻辑有一些了解,但在检测字符串
中的unicode字符时需要一些帮助答案 0 :(得分:2)
你无法完整地说出来。
字符串只是一系列字符(可以是任意大小)。 编码;与这样的序列密不可分;将纹理意义附加到字符串上。
在Windows中,使用的编码是UTF-16,它允许你有一个平底船。它提供了可以帮助的API函数IsTextUnicode
。但要注意,不能保证它会起作用。
答案 1 :(得分:2)
没有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,只需检查所有剩余字节是否在范围内 [0128)。如果不是,则无法将文件转换为ASCII。如果他们 是,文件是 ASCII(以及UTF-8)。这也是有效的 对于大多数单字节编码,例如所有的ISO-8859编码 (现在仍然很普遍)。
对于UTF16BE,从第一个开始的每个其他字节应为0,并且 范围[0,128]中的剩余字节。如果不是,则文件不能 转换为ASCII。如果是,则从每个其他字节开始 第二个。
对于UTF16LE,从第二个开始的每隔一个字节应为0, 和[0,128]范围内的剩余字节。如果不是,则为该文件 无法转换为ASCII。如果是,则取其他所有字节, 从第一个开始。
在所有情况下,此处理在从中删除任何字节后开始 第一步。
最后,你没有说你想做什么。有编码
允许以纯格式表示所有Unicode字符的约定
ASCII;如果您生成的ASCII将由期望一个的代码处理
在这些约定中,您将必须处理完整的Unicode
(包括UTF-16中的代理对)并将Unicode转换为
目标程序所期望的编码。例如,C ++
期待通用的角色名称; for é
的表示形式
例如,\u00E9
。这意味着您还必须转换\
到\\
。 (据我所知,这个约定只适用于编程
语言,如C,C ++和Java。)