Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安全的MultiByteToWideChar使用_C_Winapi_Unicode - Fatal编程技术网

安全的MultiByteToWideChar使用

安全的MultiByteToWideChar使用,c,winapi,unicode,C,Winapi,Unicode,我有一些使用MultiByteToWideChar的代码,如下所示: wchar_t * bufferW = malloc(mbBufferLen * 2); MultiByteToWideChar(CP_ACP, 0, mbBuffer, mbBufferLen, bufferW, mbBufferLen); 请注意,代码没有使用先前对MultiByteToWideChar的调用来检查新unicode缓冲区需要多大,并且假设它是多字节缓冲区的两倍 我的问题是这种用法是否安全是否存在将字符映射

我有一些使用MultiByteToWideChar的代码,如下所示:

wchar_t * bufferW = malloc(mbBufferLen * 2);
MultiByteToWideChar(CP_ACP, 0, mbBuffer, mbBufferLen, bufferW, mbBufferLen);
请注意,代码没有使用先前对MultiByteToWideChar的调用来检查新unicode缓冲区需要多大,并且假设它是多字节缓冲区的两倍

我的问题是这种用法是否安全是否存在将字符映射为3字节或更大的unicode字符并导致溢出的默认代码页?虽然我知道使用不完全正确,但我想评估风险影响

是否存在将字符映射为3字节或更大的默认代码页[wchar_t UTF-16代码单元序列]

目前没有将单个字节映射到BMP之外的字符的ANSI代码页(即在UTF-16中需要多个2字节代码单元的代码页)

在UTF-16中,任何单个多字节ANSI字符都不能被编码为两个以上的2字节代码单元。因此,更糟糕的是,您永远不会得到长度超过输入ANSI字符串2倍的UTF-16字符串(不包括空终止符,因为您传递的是显式长度,所以在这种情况下不适用),最多只能得到一个UTF-16字符串,它的
wchar\u t
字符数少于输入字符串的
char
字符数

值得一提的是,微软不会再进一步开发ANSI代码页,我怀疑NLS文件格式需要更改才能允许它,所以这在未来很可能不会改变。但API并没有明确承诺这一点一定会一直保持不变

是否存在将字符映射为3字节或更大的默认代码页[wchar_t UTF-16代码单元序列]

目前没有将单个字节映射到BMP之外的字符的ANSI代码页(即在UTF-16中需要多个2字节代码单元的代码页)

在UTF-16中,任何单个多字节ANSI字符都不能被编码为两个以上的2字节代码单元。因此,更糟糕的是,您永远不会得到长度超过输入ANSI字符串2倍的UTF-16字符串(不包括空终止符,因为您传递的是显式长度,所以在这种情况下不适用),最多只能得到一个UTF-16字符串,它的
wchar\u t
字符数少于输入字符串的
char
字符数


值得一提的是,微软不会再进一步开发ANSI代码页,我怀疑NLS文件格式需要更改才能允许它,所以这在未来很可能不会改变。但是,API并没有明确承诺这一点一定会一直保持不变。

您正确指定了缓冲区大小,因此不会出错。转换后的字符串是否真正适合是次要的,并且与编码或代码点值无关,如果不适合,您将得到错误\u缓冲区不足\u缓冲区。你最好不要冒这种失败模式的风险,但这完全取决于你自己。@Olaf这里不需要MCVE。这是Win32,所有相关信息都已提供。很抱歉没有包含正确的标记,谢谢@HansPassant的回答。没有字符,其UTF-16编码长度为3字节。除非你在处理一个字节是八位字节偶数倍的平台。Windows不是。您正在正确指定缓冲区大小,因此不会出错。转换后的字符串是否真正适合是次要的,并且与编码或代码点值无关,如果不适合,您将得到错误\u缓冲区不足\u缓冲区。你最好不要冒这种失败模式的风险,但这完全取决于你自己。@Olaf这里不需要MCVE。这是Win32,所有相关信息都已提供。很抱歉没有包含正确的标记,谢谢@HansPassant的回答。没有字符,其UTF-16编码长度为3字节。除非你在处理一个字节是八位字节偶数倍的平台。Windows不是。