iconv() - 如何确定输出缓冲区的大小?

时间:2014-05-26 19:08:10

标签: c++ c utf-8

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

1 个答案:

答案 0 :(得分:1)

基本上你想要做两件事:

  1. 获取每个字符的实际代码点(如果“Unicode”表示UTF-16,则需要适当处理代理对)
  2. 确定代码点在UTF-8中占用的字节数。
  3. 我会假设你知道如何做第一步,并将重点放在第二步:

    • 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以外的任何内容都是毫无意义的。我仅为了完整性而将其他人包括在内。