【问题标题】:How to convert an ASCII string to an UTF8 string in C++?如何在 C++ 中将 ASCII 字符串转换为 UTF8 字符串?
【发布时间】:2011-01-21 19:28:21
【问题描述】:

如何在 C++ 中将 ASCII std::string 转换为 UTF8 (Unicode) std::string?

【问题讨论】:

    标签: c++ string unicode ascii utf


    【解决方案1】:
    std::string ASCIIToUTF8(std::string str) {
      return str;
    }
    

    每个 ASCII 字符在 UTF8 中都有相同的表示,所以没有什么可以转换的。 当然,如果输入字符串使用扩展的(8位)ASCII字符集,答案就更复杂了。

    【讨论】:

    • 术语“扩展 ASCII”主要仅用于 CP437(或其他 MS-DOS 代码页),这些天几乎已绝迹。
    • @Tronic:没错,但归根结底,作为 ASCII 超集的任何 8 位字符集都是扩展的 ASCII 字符集。 :)
    • @Eduardo:哪种 unicode? ASCII 字符串已经是完全有效的 UTF8 Unicode 字符串。 Unicode 定义了几种不同的编码。
    【解决方案2】:

    ASCII 是一种七位编码,并且完全映射到可以用 ASCII 表示的字符子集的 UTF-8 编码。

    简而言之,没有什么可做的。您的 ASCII 字符串已经是有效的 UTF-8。

    【讨论】:

      【解决方案3】:

      我假设 ASCII 是指 CP1252 或其他 8 位字符集(ASCII 只有 7 位,它直接与 UTF-8 兼容,无需转换)。标准 C++ 做不到。你需要例如Glibmm、Qt、iconv 或 WINAPI 来做。

      【讨论】:

      • 这是一个很大的假设。 CP1252 是非常特定于平台的,问题中没有平台指示。
      • 这就是我说“或其他”的原因。但是,Windows 用户似乎对字符集最无知。假设 CP1252 从 8 位转换时的一大好处是它也与 ISO-8859-1 兼容(但不是相反)。
      • 多么奇怪的评论。代码页 1252 在很大程度上是 Windows 特定的编码。说 Windows 用户对 Windows 特定的实现细节“最无知”是,呃,无知。
      • 这可能仍然是当今最常见的 8 位字符编码。它还与 ISO-8859-1 兼容,这恰好是最标准化的编码。由于这两个原因,甚至一些 UNIX 程序(例如 Irssi)默认使用 CP1252 进行转换。 UNIX 用户通常不那么无知,因为他们必须一直处理 UTF-8 和更旧的字符编码(或者至少在几年前必须处理。另一方面,Windows 开发人员经常将所有 8 位编码称为 ANSI(好像它只有一个字符集)甚至 ASCII(好像是 8 位)。
      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2014-01-29
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2016-09-04
      相关资源
      最近更新 更多