我们目前面临的问题是,在使用Windows文件打开/保存对话框时加载了一个外部组件(我们遗憾地不知道哪一个),有些系统可能会通过调用来更改进程的语言环境setlocale(LC_ALL, "").
这会混淆我们的应用程序,因为它依赖于所设置的标准语言环境(在运行时期间我们自己的任何组件都不会更改).
因此,我们需要确保setlocale()在进程内调用时从未产生任何影响,或者我们需要在调用此函数时检测,然后将语言环境重置为默认的"C"语言环境.
有没有办法实现这些目标?
这实际上并不是问题的直接答案,而是根本问题的解决方案。事实证明,最近的 iCloud 更新导致了这个问题,例如,请参阅这篇文章:
https://discussions.apple.com/thread/5356698
所以有两种解决方案,一种是重命名ShellStreams.dll,另一种是完全卸载iClould(如果无论如何都没有使用的话)。
可以使用的实际保护是setlocale()仅使线程全局而不是进程全局:
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)
Run Code Online (Sandbox Code Playgroud)
它在我们的简单测试应用程序中有效,但在现实世界中不起作用(因此对我们来说不是实际的解决方案)。
如果您无法卸载 iCloud,解决此问题的最可靠方法是使用“_l”函数,该函数使用特定区域设置进行工作,如下所示:
_locale_t localeInfo = _create_locale(LC_NUMERIC, "C");
_sprintf_l(string, format, localeInfo, number);
_free_locale(localeInfo);
Run Code Online (Sandbox Code Playgroud)