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

iconv()-如何确定输出缓冲区所需的大小? 在我的C++代码中,我需要使用ICON()将Unicode字符串转换成UTF-8字符串。在调用函数之前,我需要分配适当的缓冲区大小。我看到的几个例子过度分配了缓冲区(例如,输入字符串长度的两倍)。我想知道是否有办法确定转换所需的确切尺寸。问候。,c++,c,utf-8,C++,C,Utf 8,基本上你想做两件事: 获取每个字符中的实际代码点(如果“Unicode”表示UTF-16,则需要适当地处理代理项对) 确定UTF-8中代码点将占用多少字节 我假设您了解如何执行第一步,并将重点关注第二步: U+0000..U+007F=1字节 U+0080..U+07FF=2字节 U+0800..U+FFFF=3字节 U+10000..U+1FFFF=4字节* U+200000..U+3FFFFFF=5字节* U+4000000..U+7FFFFFFF=6字节* *UTF-8可以对21474

基本上你想做两件事:

  • 获取每个字符中的实际代码点(如果“Unicode”表示UTF-16,则需要适当地处理代理项对)
  • 确定UTF-8中代码点将占用多少字节
  • 我假设您了解如何执行第一步,并将重点关注第二步:

    • U+0000..U+007F=1字节
    • U+0080..U+07FF=2字节
    • U+0800..U+FFFF=3字节
    • U+10000..U+1FFFF=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和可能的其他系统(如IBMAIX,其中wchar\u t是UTF-16)上,您需要在解码过程中处理代理项对。由于您使用的是wchar\u t,在某些平台上甚至可能不是UTF-16或UTF-32,因此最好让ICU这样的Unicode库来完成这项工作。如果您只使用一组特定的平台,您知道wchar\u t的行为,那么请务必使用iconv。