给定 C 中的字符串,我怎么知道它是用 ASCII 编码还是 Unicode 编码的?
我们什么都不知道。
这实际上是一个深刻而微妙的问题。有一些简单的案例可以剔除。剩下的就不是那么容易了。
例如,如果字符串以 Unicode 字节顺序标记开头,则可以安全地假设该字符串是 Unicode。然而,并非所有 Unicode 字符串都以 BOM 开头。
如果字符串的每个字节都清除了第八位,那么可以安全地假设它是 7 位 ASCII。如果为真,那么它当然也是有效的 UTF-8。但它可以用很少见但定义明确的 UTF-7 编码,其中所有字节都保证只使用 7 位,为通信通道中的奇偶校验或其他损坏源留出空间。
您可以扫描字符串(或至少是字符串的前缀)并测试是否符合格式良好的 UTF-8。如果通过,它可能是 UTF-8。当然,它可能采用其他编码,只是碰巧符合。
扫描是否符合 UTF-16LE 或 UTF-16BE 也同样可行,但有相同的注意事项。
Raymond Chen在他的博客中写过这个,从记事本应该如何处理文件的角度来看。
取决于您所说的“Unicode”是什么意思,它是一组字符及其属性的标准,而不是编码。Unicode 指定了几种编码,例如 UTF-8、UTF-16 和 UTF-32。
如果您想知道文本是 ASCII 还是 UTF-8,而这些是唯一的可能性,答案是它始终是 UTF-8,也可能是 ASCII(当且仅当它不包含大于 127 的字节时) .
如果它可能是 ASCII 或 UTF-16,如果它包含任何大于 127 的字节,您同样可以确定它是 UTF-16,但如果它只包含 0-127 范围内的字节,从技术上讲它可能是 ASCII 或UTF-16。您当然可以使用启发式方法来判断可能的字符/模式,并对预期的含义进行非常合理的猜测,除非文本非常短。