除非字符串本身包含有关其格式的信息(例如标题或字节顺序标记),否则没有万无一失的方法来检测字符串是ANSI还是Unicode.Windows API包含一个调用的函数IsTextUnicode()
,它基本上猜测字符串是ANSI还是Unicode,但是由于你被迫猜测,你会遇到这个问题.
为什么你首先有一个指向字符串的无类型指针?您必须确切地知道数据表示信息的内容和方式,方法是首先使用类型指针或提供ANSI/Unicode标志或其他内容.除非你确切知道它代表什么,否则一串字节是没有意义的.
Unicode 不是编码,它是代码点到字符的映射.例如,编码是UTF8或UCS2.
并且,如果你将自己限制在较低的128个字符,那么ASCII和UTF8编码之间没有区别,你实际上无法区分它们.
你最好不要问是否有办法区分ASCII和Unicode的特定编码.对此的答案是使用统计分析,具有不准确的固有可能性.
例如,如果整个字符串由小于128的字节组成,那么它是ASCII(它可能是UTF8但是没有办法告诉,在这种情况下没有区别).
如果它主要是英语/罗马语,并且由许多双字节序列组成,其中零作为字节之一,则可能是UTF16.等等.如果没有实际的某种指标(例如BOM),我不相信这是一种万无一失的方法.
我的建议是不要让自己处于你必须猜测的位置.如果数据类型本身不能包含指示符,请为ASCII和Unicode的特定编码提供不同的函数.然后强制决定你的客户的工作.在调用层次结构中的某个时刻,某人现在应该进行编码.
或者,更好的是,完全抛弃ASCII,拥抱新世界并专门使用Unicode.使用UTF8编码,ASCII完全没有优于Unicode的优势:-)