【发布时间】:2011-05-19 11:33:23
【问题描述】:
有一个指向某个缓冲区的无类型指针,该缓冲区可以保存 ANSI 或 Unicode 字符串,我如何判断它保存的当前字符串是否为多字节?
【问题讨论】:
标签: c++ c string unicode ansistring
有一个指向某个缓冲区的无类型指针,该缓冲区可以保存 ANSI 或 Unicode 字符串,我如何判断它保存的当前字符串是否为多字节?
【问题讨论】:
标签: c++ c string unicode ansistring
除非字符串本身包含有关其格式的信息(例如标题或a byte order mark),否则没有万无一失的方法可以检测字符串是 ANSI 还是 Unicode。 Windows API 包含一个名为 IsTextUnicode() 的函数,它基本上可以猜测字符串是 ANSI 还是 Unicode,但 then you run into this problem 因为你是 forced to guess。
为什么你首先有一个指向字符串的无类型指针?您必须确切地知道您的数据是什么以及如何表示信息,或者首先使用类型化的指针,或者提供一个 ANSI/Unicode 标志或其他东西。一串字节是没有意义的,除非你确切地知道它代表什么。
【讨论】:
一般情况下你不能
您可以检查零的模式 - 最后一个可能意味着 ansi 'c',每隔一个字节一个零可能意味着 ansi 文本为 UTF16,3zeros 可能是 UTF32
【讨论】:
Unicode 不是一种编码,它是码点到字符的映射。 编码例如是UTF8或UCS2。
而且,鉴于 ASCII 和 UTF8 编码之间存在零的差异,如果您将自己限制为 128 个较低的字符,您实际上无法分辨出差异。
您最好询问是否有办法区分 ASCII 和特定的 Unicode 编码。对此的答案是使用统计分析,但存在不准确的固有可能性。
例如,如果整个字符串由小于 128 的字节组成,则它是 ASCII(它可能是 UTF8,但无法分辨,在这种情况下没有区别)。
如果它主要是英语/罗马语,并且由许多以零作为字节之一的两字节序列组成,则它可能是 UTF16。等等。如果没有某种指标(例如 BOM),我认为没有万无一失的方法。
我的建议是不要将自己置于必须猜测的位置。如果数据类型本身不能包含指示符,请为 ASCII 和 Unicode 的特定编码提供不同的功能。然后强迫你的客户做决定。在调用层次结构中的某个点,someone 现在应该进行编码。
或者,更好的是,完全抛弃 ASCII,拥抱新世界并专门使用 Unicode。使用 UTF8 编码,ASCII 完全没有优于 Unicode :-)
【讨论】:
"hello\0world" 的长度不是简单的 end - start 计算,它实际上是 5 并且你有查看每个字节以找出答案。 UTF8 让它变得非常简单,因为您可以仅通过位模式来区分起始字节和延续字节。