@UCRT 的一个 BUG
发现了微软 UCRT 的一个BUG
_wsetlocale
会接收形如 zh-Hans-CN.abc-8
的参数,其中 abc-8
会被解析成 utf-8
,其原因在于 C:\Program Files (x86)\Windows Kits\10\Source\10.0.22621.0\ucrt\locale\wsetlocale.cpp
文件的函数_expandlocale
中,第 1268、1269 行 的判断语句中少了一对括号。函数的代码片段如下:
// Allow .utf8/.utf-8 for BCP-47 tags.
if ( __ascii_towlower(cp[0]) == L'u'
&& __ascii_towlower(cp[1]) == L't'
&& __ascii_towlower(cp[2]) == L'f'
&& (cp[3] == L'8' && cp[4] == L'\0')
|| (cp[3] == L'-' && cp[4] == L'8' && cp[5] == L'\0'))
{
iCodePage = CP_UTF8;
}
后面的 ||
应该用括号括起来,改成下面这样:
// Allow .utf8/.utf-8 for BCP-47 tags.
if ( __ascii_towlower(cp[0]) == L'u'
&& __ascii_towlower(cp[1]) == L't'
&& __ascii_towlower(cp[2]) == L'f'
&& ( (cp[3] == L'8' && cp[4] == L'\0')
|| (cp[3] == L'-' && cp[4] == L'8' && cp[5] == L'\0')) )
{
iCodePage = CP_UTF8;
}
在改动之前,代码页只要是以 -8
结尾的长度为 5
的字符串,就会被识别成 CP_UTF8。