代码之家  ›  专栏  ›  技术社区  ›  MK.

setLocale()不影响convertbsertoString(),但系统范围的设置会影响?

  •  0
  • MK.  · 技术社区  · 14 年前

    鉴于: 使用旧COM库的ASP.NET应用程序 未使用unicode(mbcs)构建的旧COM库 运行它的Windows 2008 Dev服务器

    需要: 支持不同地区的Web应用程序用户

    测试:

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

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

    2)我将系统区域设置回US/English,向ASP.NET应用程序或COM本身添加代码,将区域设置显式设置为俄语,区域设置成功(我查询并返回俄语),COM接收UTF-16 BSTR,使用convertbsertostring将其转换为char*并获取问号“???”!

    为什么??在整个系统范围内设置区域设置和在进程中调用setlocale()有什么区别?那么setlocale的意义是什么呢?convertbsttoString是否使用了当前区域设置以外的内容?

    我也试过做

        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 回复  |  直到 14 年前
        1
  •  1
  •   Hans Passant    14 年前

    文档中不清楚convertbsertostring()用于确定当前区域设置的内容。但你可以很确定 由setLocale()设置的CRT区域设置。您几乎肯定需要调用sethreadLocale()。

    使用wideChartomultiByte()减少猜测。