【问题标题】:iconv() - How to determine the requires size for output buffer? [duplicate]iconv() - 如何确定输出缓冲区所需的大小? [复制]
【发布时间】:2014-05-26 19:08:10
【问题描述】:

在我的 C++ 代码中,我需要使用 iconv() 将 Unicode 字符串转换为 UTF-8 字符串。在调用该函数之前,我需要分配适当的缓冲区大小。我见过的几个示例过度分配缓冲区(例如,输入字符串长度的两倍)。我想知道是否有办法确定转换所需的确切大小。问候。

【问题讨论】:

    标签: c++ c utf-8


    【解决方案1】:

    基本上你想做两件事:

    1. 获取每个字符中的实际代码点(如果“Unicode”表示 UTF-16,则需要适当处理代理对)
    2. 确定代码点在 UTF-8 中将占用多少字节。

    我假设您已经了解如何进行第一步,并将专注于第二步:

    • U+0000..U+007F = 1 个字节
    • U+0080..U+07FF = 2 个字节
    • U+0800..U+FFFF = 3 个字节
    • U+10000..U+1FFFFF = 4 字节*
    • U+200000..U+3FFFFFF = 5 个字节*
    • U+4000000..U+7FFFFFFF = 6 个字节*

    * UTF-8 可以编码 2147483648 个代码点 [0...0x7FFFFFFF],但 UTF-16 只能编码其中的前 1114112 个 [0...0x10FFFF],这是目前唯一指定的。因此,在撰写本文时,超出 U+10FFFF 的任何内容都毫无意义。我将其他人包括在内只是为了完整。

    【讨论】:

    • 感谢您的指导。我学到了一些新东西。我的输入是 wchar_t* 类型。这在 Windows 上是 UTF-16,但在 Linux 上是 4 个字节长。在 4 个字节中,您的解释中的 U 是指第一个字节吗?问候。
    • @Peter U+xxxx 表示法只是引用 Unicode 代码点的方式。例如,U+12AB 是代码点 0x12AB。在 Windows 和可能的其他系统上,例如 IBM AIX,其中 wchar_t 是 UTF-16,您需要在解码中处理代理对。由于您使用的是 wchar_t,它在某些平台上甚至可能不是 UTF-16 或 UTF-32,因此您最好让 Unicode 库(如 ICU)来完成这项工作。如果您只使用了解 wchar_t 行为的特定平台集,那么请务必使用 iconv。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多