如果有一个无类型指针指向一个可以容纳ANSI或Unicode字符串的缓冲区,我如何判断它所持有的当前字符串是否是多字节的?
答案 0 :(得分:9)
除非字符串本身包含有关其格式的信息(例如标题或a byte order mark),否则没有万无一失的方法来检测字符串是ANSI还是Unicode。 Windows API包含一个名为IsTextUnicode()
的函数,它基本上猜测一个字符串是ANSI还是Unicode,而then you run into this problem是因为你是forced to guess。
为什么首先有一个指向字符串的无类型指针?您必须确切地知道数据表示信息的内容和方式,方法是首先使用类型指针或提供ANSI / Unicode标志或其他内容。除非你确切知道它代表什么,否则一串字节是没有意义的。
答案 1 :(得分:5)
Unicode 不是编码,它是代码点到字符的映射。例如,编码是UTF8或UCS2。
并且,如果您将自己限制在较低的128个字符,那么ASCII和UTF8编码之间存在零差异,您实际上无法区分它们。
你最好不要问是否有办法区分ASCII和Unicode的特定编码。答案就是使用统计分析,固有的可能性是不准确的。
例如,如果整个字符串由小于128的字节组成,那么它是ASCII(它可以是UTF8但是没有办法告诉,在这种情况下没有区别)。
如果它主要是英语/罗马语,并且由许多双字节序列组成,其中零作为字节之一,则可能是UTF16。等等。如果没有实际的某种指标(例如BOM),我不相信这是一种万无一失的方法。
我的建议是不要让自己处于你必须猜测的位置。如果数据类型本身不能包含指示符,请为ASCII和Unicode的特定编码提供不同的函数。然后强制决定你的客户的工作。在调用层次结构中的某个时刻,某人现在应该进行编码。
或者,更好的是,完全抛弃ASCII,拥抱新世界并专门使用Unicode。使用UTF8编码,ASCII具有完全 no 优于Unicode的优点: - )
答案 2 :(得分:2)
一般情况下你不能
你可以检查零的模式 - 最后一个可能意味着ansi'c',每隔一个字节一个零可能意味着ansi文本为UTF16,3zeros可能是UTF32