Visual C++的C/C++运行库现在已经支持UTF-8文件名,但是。。。

只要你在使用Windows 10、Visual Studio 2019最新版,使用以下两句之一,即可将C/C++内置函数字符编码改成UTF-8,包括之前独立于locale的比如fopenfstream的文件名。

// C
setlocale(LC_CTYPE, ".utf8");
// C++
locale oldlocale = locale::global(locale("LC_CTYPE=.utf8"));

几个例外是tmpnam函数、命令参数(main的argv)、环境变量(environ、main的envp、getenv、putenv)默认使用ANSI不会改变,这是由于它们是返回的静态存储区,或者是启动时设置的,没有办法随着locale而改变。

这些可以使用对应的宽字符版本(_wtmpnam、wmain的argv、_wenviron、wmain的envp、_wgetenv、_wputenv)或直接使用WinAPI,其中tmpnam已不推荐使用,命令参数第三方库一般不会读取,完全自己做主,环境变量也可以手动用putenv修正一遍。

具体改动可以参考C:\Program Files (x86)\Windows Kits\10\Source\10.0.18362.0\ucrt\inc\corecrt_internal_traits.h

使用这个功能最好静态编译,如果需要动态编译的话,一定要注意ucrtbase.dll的版本号。如果版本号低于10.0.17763,则不支持UTF-8功能。vcredist_x64.exe、vcredist_x86.exe针对老系统安装的是10.0.10240版本。附带ucrtbase.dll可以解决Windows Vista/7/8/8.1的ucrtbase.dll的版本号,但是Windows Server 2016是无法解决的,因为它并不会加载附带的ucrtbase.dll,只会用系统自带的版本。

因此这个改动对于需要兼容老版本Windows的应用开发者来说实际意义不大,对于微软内部使用意义更大一些,比如2020年Windows 7寿终正寝以后,微软很多产品如Office将只兼容Windows 10,这时候就可以将这个功能用起来了。

发布了29 篇原创文章 · 获赞 1 · 访问量 3413

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/102765981
今日推荐