2010-07-13 67 views
0

考慮: 支持Web應用程序在不同的用戶:該方法使用的不統一(MBCS)在其上運行的所有setlocale()不影響ConvertBSTRToString(),但系統範圍的設置呢?

所需的Windows 2008年開發服務器內置了傳統的COM庫 傳統的COM庫 ASP.Net應用程序語言環境

測試:

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)); 

沿着側的setlocale()COM庫內部;沒有效果。

我真的很感激!

回答

1

從文檔中不清楚ConvertBSTRToString()用於確定當前語言環境。但是你可以很確定它是由setlocale()設置的CRT區域設置而不是。你幾乎肯定需要調用SetThreadLocale()。

使用WideCharToMultiByte()來減少猜測。

+0

謝謝,我試過並更新了這個問題。似乎沒有區別。 – 2010-07-13 19:20:43

+0

@MK:答案已更新。 – 2010-07-13 19:36:15

+0

謝謝你,你是對的。 ConvertBSTRToString()調用WideCharToMultiByte(),忽略區域設置。調用WideCharToMultiByte()明確地解決了這個問題(除了代碼依賴於遍佈各處的破壞的ConvertBSTRToString(),並修復這將是非平凡的,謝謝微軟) – 2010-07-13 20:48:15