检查Unicode字符串是否为空格 - 字节为字节!

Oys*_*ein 2 unicode whitespace encoding ascii utf-8

快速和脏问:我可以安全地假设UTF-8,UTF-16或UTF-32码点(字符)的字节不是 ASCII空白字符(除非代码点代表一个)?

我会解释一下:

假设我有一个UTF-8编码的字符串.此字符串包含一些需要存储多个字节的字符.我需要找出这个字符串中的任何字符是否是ASCII空格字符(空格,水平制表符,垂直制表符,回车符,换行符等 - Unicode定义了一些空白字符,但忘了它们).

所以我做的是循环遍历字符串并检查是否有任何字节与定义空白字符的字节匹配.以0D(十六进制)为例进行回车.请注意,我们在这里讨论字节,而不是字符.

这会有用吗?是否存在UTF-8代码点,其中第一个字节为0D,第二个字节为其他字节 - 此代码点不代表回车符?也许相反?是否存在第一个字节奇怪的代码点,第二个(或第三个或第四个)字节是0D - 这个代码点不代表回车符?

UTF-8向后兼容ASCII,所以我真的希望它适用于UTF-8.据我所知,它可能会,但我不清楚细节,不能肯定地说.

至于UTF-16和UTF-32,我怀疑它是否会起作用,但我对这些细节几乎一无所知,所以请随意给我一些惊喜......


这个令人讨厌的问题的原因是我有代码检查用于ASCII的空白,我需要知道它是否可能在Unicode上中断.由于一系列原因,我别无选择,只能逐字节检查.我希望向后兼容ASCII可能会给我至少免费的UTF-8支持.

Mar*_*tos 7

对于UTF-8,是的,你可以.所有非ASCII字符都由高位设置的字节表示,所有ASCII字符都设置为高位.

需要明确的是,非ASCII字符编码中的每个字节都设置了高位; 这是设计的.

您永远不应该在字节级别上使用UTF-16或UTF-32.这几乎肯定是行不通的.实际上很多东西都会破坏,因为每个第二个字节都可能是'\0'(除非你通常使用另一种语言).


Rob*_*edy 5

正确编码的 UTF-8中,所有ASCII字符将被编码为每个字节一个字节,并且每个字节的数值将等于Unicode和ASCII代码点.此外,任何非ASCII字符将使用具有第八位设置的字节进行编码.因此,字节值0D将始终表示回车符,而不是多字节UTF-8序列的第二个或第三个字节.

但是,有时会滥用UTF-8解码规则以其他方式存储ASCII字符.例如,如果采用双字节序列C0 A0和UTF-8解码它,则得到一个字节值20,即空格.(每当你找到字节C0或C8时,它就是ASCII字符的双字节编码的第一个字节.)我已经看到这样做来编码最初被认为是单个字的字符串,但后来的要求增加到允许值有空格.为了不破坏现有代码(使用类似的东西strtoksscanf识别空格分隔的字段),使用这个标准化的UTF-8而不是真正的UTF-8对值进行编码.

不过,你可能不需要担心.如果您的程序输入使用该格式,那么您的代码可能并不意味着在那时检测特殊编码的空格,因此您可以安全地忽略它.