【问题标题】:What encoding does std::string.c_str() use?std::string.c_str() 使用什么编码?
【发布时间】:2010-11-03 21:23:21
【问题描述】:

我正在尝试将 C++ std::string 转换为 UTF-8 或 std::wstring 而不会丢失信息(考虑包含非 ASCII 字符的字符串。

根据http://forums.sun.com/thread.jspa?threadID=486770&forumID=31

如果 std::string 包含非 ASCII 字符,您必须提供一个函数,将您的编码转换为 UTF-8 [...]

std::string.c_str() 使用什么编码?如何以跨平台方式将其转换为 UTF-8 或 std::wstring

【问题讨论】:

    标签: c++ string utf-8


    【解决方案1】:

    std::string 本身不使用编码——它会返回您放入其中的字节。例如,这些字节可能正在使用 ISO-8859-1 编码...或任何其他编码,真的:关于编码的信息不存在——您必须知道这些字节来自哪里!

    【讨论】:

    • 所以基本上没有办法让我在不提前知道其编码的情况下转换 std::string 吗?我问是因为我正在编写一个接受 std::string 的 API 函数。我想文档需要指导用户传递什么格式。
    • @Gili,对:您无法可靠地将未知编码的字节序列转换为 UTF-8(或其他任何内容;-)。我建议您让调用者提供 UTF-8 数据——大多数其他编码不允许编码 每个 可能的 Unicode 字符串。正如@Naaff 所说,ASCII 是 UTF-8(以及 ISO-8859-* 和许多其他编码)的​​特例,所以如果这是你的情况,不用担心(文档中的脚注提醒用户这一事实可能会节省 他们担心;-)。
    • ISO-8859-* 绝不是 UTF-8 的“特例”。它们只是不同的单字节编码。
    • ASCII 字符串也是 UTF-8 字符串和 ISO-8859-1 字符串 &c:这就是为什么括号在 UTF-8 之后而不是在 ASCII 之后;-)。
    • 文档支持这一点:请注意,此类处理字节独立于所使用的编码:如果用于处理多字节或可变长度字符序列(例如 UTF-8) ,该类的所有成员(例如长度或大小)以及它的迭代器,仍将按照字节(不是实际编码字符)进行操作。 cplusplus.com/reference/string/string
    【解决方案2】:

    std::string 包含任何字节序列,因此编码由您决定。您必须知道它是如何编码的。但是,如果您不知道它是其他东西,它可能只是 ASCII。在这种情况下,它已经兼容 UTF-8。

    【讨论】:

    • 我已经看到“它可能只是……”是许多字符编码错误的根源。我建议在涉及字符编码时永远不要猜测:始终非常明确地说明您采用的内容和产生的内容。在每种情况下,如果您不指定字符集,则指定一个额外的参数/返回值来指示编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多