我有一个utf16 wchar_t *我需要转换并转储到utf8 char *。我正在使用std :: wcstombs来执行此操作,并使用wchar_t *的长度作为最大长度。
我对utf编码的工作方式有点模糊,但IIRC,单个字符可能会占用多个字节,在这种情况下我可能会丢失一些字符。
目前可能出现的字符非常有限,甚至可能适合ASCII字符集,但后来,我计划允许更多,例如öäõü等。我会在那里遇到问题吗?如果是这样,我将如何衡量我需要分配的缓冲区的长度?
答案 0 :(得分: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字符集之外没有字符时,这才有效。