setlocale()不影响ConvertBSTRToString(),但系统范围的设置呢?

时间:2010-07-13 18:38:25

标签: .net localization interop clr locale

给定: 使用传统COM库的ASP.Net应用程序 不使用Unicode构建的旧版COM库(MBCS) 运行它的Windows 2008 dev服务器

需要: 支持不同语言环境中的Web应用程序用户

测试:

1)我将服务器上的系统区域设置设置为俄语并测试俄语输入。

.NET将它们视为UTF16,将其作为BSTR传递给COM,COM使用ConvertBSTRToString和当前语言环境(俄语)将其转换为char *,将它们写入文件,将它们读取到文件,传回.NET并获得正确结果

2)我将系统区域设置设置回美国/英语,将代码添加到ASP.NET应用程序或COM本身以明确地将区域设置设置为俄语,区域设置成功设置(我查询并获取俄语), COM接收UTF-16 BSTR,使用ConvertBSTRToString将其转换为char *并获取问号“???”!

为什么?在系统范围内设置区域设置和在进程中调用setlocale()之间的区别是什么?那么setlocale有什么意义呢? ConvertBSTRToString是否使用当前区域设置以外的东西?

我也尝试过做

    System.Threading.Thread.CurrentThread.CurrentCulture = 
new System.Globalization.CultureInfo("ru-RU");

在COM对象的ASP.NET调用者中并尝试执行

setlocale(LC_ALL, "Russian");

        SetThreadLocale(
MAKELCID(MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), SORT_DEFAULT));

在COM库中的setlocale()旁边;没有效果。

我真的很感激你的投入!

1 个答案:

答案 0 :(得分:1)

从文档中不清楚ConvertBSTRToString()用于确定当前语言环境的内容。但是你可以非常肯定它是由setlocale()设置的CRT语言环境。你几乎肯定需要调用SetThreadLocale()。

使用WideCharToMultiByte()来减少猜测。