给定: 使用传统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()旁边;没有效果。
我真的很感激你的投入!
答案 0 :(得分:1)
从文档中不清楚ConvertBSTRToString()用于确定当前语言环境的内容。但是你可以非常肯定它是不由setlocale()设置的CRT语言环境。你几乎肯定需要调用SetThreadLocale()。
使用WideCharToMultiByte()来减少猜测。