C# CultureInfo中常用的InvariantCulture

weixin_33912246發表於2017-04-24

本文參考自CultureInfo中重要的InvariantCulture,純屬讀書筆記,加深記憶

1、CultureInfo的InvariantCulture的作用

(1)、CultureInfo使整個.NET Framework更加人性化,因為這可以使同一個資料適應不同地區和文化,這樣當然滿足處於不同地區和文化的使用者。但前提是資料給“人”看,如果這些資料用於計算機之間的傳輸,即給“機器”看,這樣的多文化處理反而不妥,造成同一個資料的不同展現形式,尤其是讀寫兩方的文化地區不同時,資料可能根本無法被正常讀取或者產生潛在bug,因此這裡,正是InvariantCulture的用武之地。

(2)、當進行數字,日期時間,字串匹配時,都會進行CultureInfo的操作,也就是不同的CultureInfo下,這些操作的結果可能會不一樣。這裡要介紹一下非常容易被忽視InvariantCulture。

 

2、使用場景

你編寫一個程式,要向資料中心伺服器傳遞一些時間資料,你會怎麼寫?直接DateTime.ToString()?那你就大錯特錯了,下面用程式碼,舉個非常形象的例子。在一個控制檯裡,模擬資料中心,然後放出多個執行緒,模擬客戶端程式傳遞資料。

        static readonly string[] CultureSources = { "en-us", "zh-cn", "ar-iq", "de-de" };
        static readonly Random Ran = new Random(Environment.TickCount);
        static void Main()
        {
            Console.WriteLine("資料中心開始接受客戶端資料:");
            for (int i = 0; i < CultureSources.Length; i++)
                ThreadPool.QueueUserWorkItem(Client, i);
            Console.ReadKey(true);

            Console.WriteLine("");
            Console.WriteLine("資料中心:…………");
        }

        static void Client(object obj)
        {
            int id = (int)obj;
            Thread.Sleep(Ran.Next(1000));

            CultureInfo cul = CultureInfo.GetCultureInfo(CultureSources[id]);
            Thread.CurrentThread.CurrentCulture = cul;
            Console.WriteLine("某客戶端作業系統語言設定{0}\n傳送資料:{1}\n", cul.DisplayName, new DateTime(1990, 10, 27).ToShortDateString());
        }

同樣的DateTime.ToShortDateString(),在英語-美國,中文-中國,阿拉伯語-伊拉克和德語-德國的不同環境下,1990年10月27日竟然有如此不同的輸出結果,這些資料讓資料中心伺服器情何以堪啊!!!

造成這個情況的原因是:在進行日期時間輸出時,.NET會考慮當前執行緒的CultureInfo,即Thread.CurrentThread.CurrentCulture(或者CultureInfo.CurrentCulture),並根據CultureInfo,進行相應地區文化的資料處理。注意不要和UICulture混淆。

解決方案就是使用這個特殊的InvariantCulture.解決程式碼如下:

Console.WriteLine("某客戶端作業系統語言設定{0}\n傳送資料:{1}\n", cul.DisplayName, new DateTime(1990, 10, 27).ToString(CultureInfo.InvariantCulture.DateTimeFormat.ShortDatePattern, CultureInfo.InvariantCulture));

ok,這樣不管客戶端執行在什麼語言環境下,輸出的時間格式都是統一的,方面資料中心伺服器對資料做後續處理。這樣所有的輸出結果都保持一致了。

 

相關文章