给定C中的字符串,我怎么知道它是用ASCII还是Unicode编码的?

时间:2012-08-16 00:56:19

标签: c string unicode encoding ascii

给定C中的字符串,我怎么知道它是用ASCII还是Unicode编码的?

我们什么都不知道。

2 个答案:

答案 0 :(得分:3)

这实际上是一个深刻而微妙的问题。有一些简单的案例可以剔除。剩下的就不那么容易了。

例如,如果字符串以Unicode字节顺序标记开头,则可以安全地假设该字符串是Unicode。但是,并非所有Unicode字符串都以BOM开头。

如果字符串的每个字节都清除了第8位,那么可以安全地假设它是7位ASCII。如果是,那么它当然也是有效的UTF-8。但它可以编码在很少见但很好定义的UTF-7中,其中所有字节都保证只使用7位,为通信信道中的奇偶校验或其他损坏源留出空间。

您可以扫描字符串(或至少是字符串的前缀)并测试是否符合格式良好的UTF-8。如果它通过,它可能是UTF-8。当然,它可能是在某些其他编码中,恰好符合运气。

同样可以扫描是否符合UTF-16LE或UTF-16BE,但有相同的警告。

Raymond Chen wrote about this in his blog,从记事本如何处理文件的角度来看。

答案 1 :(得分:0)

取决于“Unicode”的含义,“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。您当然可以使用启发式方法来判断哪些字符/模式可能存在,并且除非文本非常短,否则会对预期含义进行非常合理的猜测。