【问题标题】:Distinguishing between string formats区分字符串格式
【发布时间】:2011-05-19 11:33:23
【问题描述】:

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

【问题讨论】:

    标签: c++ c string unicode ansistring


    【解决方案1】:

    除非字符串本身包含有关其格式的信息(例如标题或a byte order mark),否则没有万无一失的方法可以检测字符串是 ANSI 还是 Unicode。 Windows API 包含一个名为 IsTextUnicode() 的函数,它基本上可以猜测字符串是 ANSI 还是 Unicode,但 then you run into this problem 因为你是 forced to guess

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

    【讨论】:

      【解决方案2】:

      一般情况下你不能

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

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

        【讨论】:

        • ASCII 比 UTF8 和 UTF16 有一个优势:字节数 == 字符数。对于 UTF8/16,即使给定了 begin 和 end,您也必须遍历整个字符串以计算字符数。
        • 你为什么要关心字符数呢?它几乎总是没用的。它与物理显示宽度/列没有对应关系,并且根据您的编辑器样式甚至可能不对应于您必须按退格键擦除整个字符串的次数。通过这种方式,UTF-8 提供了巨大的帮助:它迫使您认识到并接受任何使用字符而不是字符串的代码几乎肯定是错误
        • @KitsuneYMG,无论如何你都必须为 ASCII 数据这样做 :-) 'string' "hello\0world" 的长度不是简单的 end - start 计算,它实际上是 5 并且你有查看每个字节以找出答案。 UTF8 让它变得非常简单,因为您可以仅通过位模式来区分起始字节和延续字节。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        相关资源
        最近更新 更多