【问题标题】:Given a string in C, how can I know if it is encoded in ASCII or Unicode? [closed]给定 C 中的字符串,我怎么知道它是用 ASCII 编码还是 Unicode 编码的? [关闭]
【发布时间】:2012-08-12 08:07:48
【问题描述】:

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

我们什么都不知道。

【问题讨论】:

  • 真正的 ASCII,没有超过 127 的字符,还是“extended ASCII”? UTF-8、UTF-16 还是其他?
  • 暂且不说没有“unicode”之类的东西 - 相反,它是一系列相关的 unicode 编码,它通常是由谁给你字符串来告诉你什么是编码。
  • 简短回答:你不知道。更长的答案:您可以做出相当合理的猜测,但几乎永远无法完全确定。
  • 一些关于 Windows 记事本如何做到这一点以及各种后果的说明:blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx(也请务必关注各种链接)。
  • 如果我是个笨蛋,我会告诉你“如果是 ASCII,那么它也必须是 Unicode。”您的问题真的是如何判断 C 字符串是 UTF-8 编码还是引用 Windows-1250 之类的代码页?这是可行的。

标签: c string unicode encoding ascii


【解决方案1】:

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

例如,如果字符串以 Unicode 字节顺序标记开头,那么假设该字符串是 Unicode 可能是安全的。然而,并非所有 Unicode 字符串都以 BOM 开头。

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

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

扫描是否符合 UTF-16LE 或 UTF-16BE 也同样可行,但有相同的注意事项。

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

【讨论】:

    【解决方案2】:

    取决于您所说的“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。您当然可以使用启发式方法来判断可能出现的字符/模式,并对预期的含义做出非常合理的猜测,除非文本非常短。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      相关资源
      最近更新 更多