我有像这样使用MultiByteToWideChar的代码:
wchar_t * bufferW = malloc(mbBufferLen * 2);
MultiByteToWideChar(CP_ACP, 0, mbBuffer, mbBufferLen, bufferW, mbBufferLen);
请注意,代码不使用先前对MultiByteToWideChar的调用来检查新的unicode缓冲区需要多大,并假设它将是多字节缓冲区的两倍。
我的问题是这种用法是否安全? 是否有一个默认代码页将一个字符映射为一个3字节或更大的unicode字符,并导致溢出?虽然我知道用法并不完全正确,但我想衡量风险影响。
答案 0 :(得分:3)
是否有一个默认代码页将字符映射为3字节或更大的[wchar_t UTF-16代码单元序列]
目前没有ANSI代码页将单个字节映射到BMP外部的字符(即在UTF-16中需要多个2字节代码单元的字符)。
在UTF-16中,不能将单个多字节ANSI字符编码为两个以上的双字节代码单元。因此,在更糟时,您将永远不会得到一个UTF-16字符串,其长度超过输入ANSI字符串的2倍(不包括null终止符,在这种情况下不适用)因为你传递明确的长度),并且在 best ,你将得到一个UTF-16字符串,其字符数少于输入字符串wchar_t
字符char
个字符。< / p>
对于它的价值,微软endeavouring不再进一步开发ANSI代码页,我怀疑NLS文件格式需要更改以允许它,所以它很漂亮这不太可能在将来发生变化。但是没有坚定的API承诺,这肯定会一直存在。