有一个未型的指针指向一些可以容纳ANSI或Unicode字符串的缓冲区,我该如何确定其持有的当前字符串是否为多键?

有帮助吗?

解决方案

除非字符串本身包含有关其格式的信息(例如,标题或 字节订单标记),没有万无一失的方法可以检测字符串是ANSI还是Unicode。 Windows API包含一个称为的函数 IsTextUnicode() 基本上猜测字符串是ANSI还是Unicode,但是 然后你遇到这个问题 因为你 被迫猜测.

为什么首先要有一个非型指针?您必须确切地知道数据代表信息,首先使用打字指针或提供ANSI/UNICODE标志或其他内容。除非您确切地知道它的代表,否则一串字符串是毫无意义的。

其他提示

Unicode是 不是 一个编码,是代码指向字符的映射。这 编码 例如,是UTF8或UCS2。

而且,鉴于有 ASCII和UTF8编码之间的差异如果您将自己限制在较低的128个字符中,则实际上无法分辨出区别。

您最好询问是否有一种方法可以判断ASCII和Unicode的特定编码之间的区别。答案是使用统计分析,并具有不准确性的固有可能性。

例如,如果整个字符串由小于128的字符组成,则是ASCII(它 可以 是UTF8,但没有办法说明,在这种情况下没有区别)。

如果它主要是英语/罗马人,并且由许多字节序列组成,将零作为字节之一组成,则可能是UTF16。等等。我不认为没有一种万无一失的方法,没有某种指标(例如,bom)。

我的建议是不要让自己处于必须猜测的位置。如果数据类型本身不能包含指标,请为ASCII提供不同的功能,并提供Unicode的特定编码。然后强迫决定客户的工作。在调用层次结构的某个时候, 有人 现在应该编码。

或者,更好的是,完全抛弃ASCII,拥抱新世界并专门使用Unicode。使用UTF8编码,ASCII完全具有 优于Unicode :-)

您可以检查零的模式 - 最后一个可能意味着ANSI'C',其他每个字节零可能意味着ANSI文本,因为UTF16,3zeros可能是UTF32

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top