首页 文章

utf16字符串的长度为utf8字符串

提问于
浏览
1

我有一个utf16 wchar_t *我需要转换并转储到utf8 char * . 我正在使用std :: wcstombs来执行此操作,并使用wchar_t *的长度作为最大长度 .

我对utf编码的工作方式有点模糊,但IIRC,单个字符可能会占用多个字节,在这种情况下我可能会丢失一些字符 .

目前可能出现的字符非常有限,甚至可能适合ASCII字符集,但后来,我打算允许更多,例如öäõü等 . 我会在那里遇到问题吗?如果是这样,我将如何衡量我需要分配的缓冲区的长度?

1 回答

  • 3

    BMP中的代码点(“基本多语言平面”,即其值不大于0xFFFF的代码点)需要一个UTF-16代码单元或最多三个UTF-8代码单元 . 在BMP之外,代码点需要两个UTF-16代码单元(代理对)或四个UTF-8代码单元 .

    如果您的wchar_t是两个字节(UTF-16),在最坏的情况下,UTF-8字符串可能需要三个字节用于单个wchar_t(即内存增加50%),并且4个字节用于代理对(即相同数量的记忆) .

    但是,如果你的wchar_t是四个字节(UTF-32),非BMP字符只需要一个wchar_t,所以最坏的情况是每个wchar_t有四个字节,这是相同的内存量 .

    每个wchar_t只允许一个字节肯定会让你遇到麻烦 . 只有在基本ASCII字符集之外没有字符时才会起作用 .

相关问题