2

有一个无类型指针指向某个可以保存 ANSI 或 Unicode 字符串的缓冲区,我如何判断它保存的当前字符串是否是多字节的?

4

3 回答 3

9

除非字符串本身包含有关其格式的信息(例如标题或字节顺序标记),否则没有万无一失的方法来检测字符串是 ANSI 还是 Unicode。Windows API 包含一个名为的函数,该函数IsTextUnicode()基本上猜测字符串是 ANSI 还是 Unicode,但随后您会遇到此问题,因为您被迫猜测

为什么你首先有一个指向字符串的无类型指针?您必须确切地知道您的数据是什么以及如何表示信息,或者首先使用类型化的指针,或者提供一个 ANSI/Unicode 标志或其他东西。除非您确切知道它代表什么,否则一串字节是没有意义的。

于 2010-12-03T00:03:25.647 回答
5

Unicode不是一种编码,它是代码点到字符的映射。例如,编码是 UTF8 或 UCS2。

而且,如果您将自己限制为较低的 128 个字符,那么 ASCII 和 UTF8 编码之间的差异为零,您实际上无法分辨出差异。

您最好询问是否有办法区分 ASCII 和特定的 Unicode 编码之间的区别。对此的答案是使用统计分析,但存在不准确的固有可能性。

例如,如果整个字符串由小于 128 的字节组成,则它是 ASCII(它可能是 UTF8,但无法分辨,在这种情况下也没有区别)。

如果它主要是英文/罗马文,并且由许多以零作为字节之一的两字节序列组成,那么它可能是 UTF16。等等。我不相信没有某种指标(例如,BOM)的万无一失的方法。

我的建议是不要将自己置于必须猜测的位置。如果数据类型本身不能包含指示符,请为 ASCII 和 Unicode 的特定编码提供不同的功能。然后强迫你的客户做决定。在调用层次结构中的某个点,现在应该有人进行编码。

或者,更好的是,完全抛弃 ASCII,拥抱新世界并专门使用 Unicode。使用 UTF8 编码,ASCII与 Unicode 相比没有任何优势 :-)

于 2010-12-03T00:07:06.457 回答
2

一般来说你不能

您可以检查零的模式 - 最后一个可能意味着 ansi 'c',每隔一个字节一个零可能意味着 ansi 文本作为 UTF16,3zeros 可能是 UTF32

于 2010-12-03T00:03:33.187 回答