使用Win32 API MultiByteToWideChar()
进行从Unicode UTF-8到Unicode UTF-16的转换时,是否应使用 MB_ERR_INVALID_CHARS
标记?
换句话说,如果UTF-8输入无效,这是最好的行为,为什么?
MultiByteToWideChar()
来电失败(使用MB_ERR_INVALID_CHARS
标志)U+FFFD
答案 0 :(得分:2)
从UTF-8转换为UTF-16时使用MB_ERR_INVALID_CHARS
似乎是从安全角度来看最好的做法,特别是与{{{ 3}}(如“Unicode技术报告#36:UNICODE SECURITY CONSIDERATIONS”中所述):
3.1.1形成错误的子序列
假设UTF-8转换器正在迭代输入UTF-8字节,转换为输出字符编码。如果转换器遇到格式错误的UTF-8序列,它可以通过多种不同方式将其视为错误,包括替换U + FFFD,SUB,“?”或SPACE等字符。但是,它不能使用任何有效的后继字节。例如,假设我们有以下顺序:
X =< ... 41 C2 3E 42 ...>
这个序列总体上是不正确的,因为它包含一个格式错误的子串,即< C2 > [...]
UTF-8转换器可以在C2字节处停止,或者替换像U + FFFD这样的字符或序列并继续。但是,如果继续,它不能消耗3E字节。 [...]
使用后续字节(例如 3E )不仅不符合; 可能导致安全漏洞。 [...]
事实上,使用MB_ERR_INVALID_CHARS
标志会导致MultiByteToWideChar()
API 失败存在无效的UTF-8序列,因此后续代码不存在风险(例如,调用代码)可能消耗无效子字符串之后的字节。