• 【转】CultureInfo中重要的InvariantCulture


    原贴地址:http://www.soaspx.com/dotnet/csharp/csharp_20110506_7607.html

    CultureInfo简述

    CultureInfo类位于System.Globalization命名空间内,这个类和这个命名空间许多人都不了解也认为不需要太多了解,实际上,你写的程序中会经常间接得使用这些类。简单的说:
    当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的处理,也就是不同的CultureInfo下,这些操作的结果可能会不一样。这里要介绍一下非常容易被忽视的InvariantCulture。
     
    通过示例了解InvariantCulture
    前面提到过,不同的CultureInfo会影响某些函数的执行结果,.NET中有一个特殊的CultureInfo:InvariantCulture,这个CultureInfo有点像英语格式,但它不和国家地区挂钩,它可以提供一个可靠的在多语言环境下的规范格式化。
    比如你编写一个程序,要向数据中心服务器传递一些时间数据,你会怎么写?直接DateTime.ToString()?那你就大错特错了,下面用代码,举个非常形象的例子。在一个控制台里,模拟数据中心,然后放出多个线程,模拟客户端程序传递数据。
            staticreadonlystring[] CultureSources = { "en-us""zh-cn""ar-iq""de-de" };
            staticreadonlyRandom Ran =newRandom(Environment.TickCount);
            staticvoid Main()
            {
                Console.WriteLine("数据中心开始接受客户端数据:");
                for (int i =0; i < CultureSources.Length; i++)
                    ThreadPool.QueueUserWorkItem(Client, i);
                Console.ReadKey(true);
     
                Console.WriteLine("");
                Console.WriteLine("数据中心:…………");
            }
     
            staticvoid 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, newDateTime(199010,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,
     newDateTime(19901027).ToString(
        CultureInfo.InvariantCulture.DateTimeFormat.ShortDatePattern, CultureInfo.InvariantCulture));
    这样不管客户端运行在什么语言环境下,输出的时间格式都是统一的,方面数据中心服务器对数据做后续处理。
    (当然这个例子仅用来演示InvariantCulture的用法,是否存在其他不妥处这里不做讨论)
     
    InvariantCulture和字符串比较
    下面代码进行四种字符串比较方法,分别是zh-cn, en-us文化,数值比较和InvariantCulture比较。
            staticvoid Main()
            {
                string[] strs = { "a""A""b""B""abc""ab""aB""AB""Ab""aaa" };
                Console.WriteLine("en-US");
                Array.Sort<string>(strs, StringComparer.Create(CultureInfo.GetCultureInfo("en-us"), false));
                Console.WriteLine(String.Join(" < ", strs));
     
                Console.WriteLine("zh-CN");
                Array.Sort<string>(strs, StringComparer.Create(CultureInfo.GetCultureInfo("zh-CN"), false));
                Console.WriteLine(String.Join(" < ", strs));
     
                Console.WriteLine("Ordinal");
                Array.Sort<string>(strs, StringComparer.Ordinal);
                Console.WriteLine(String.Join(" < ", strs));
     
                Console.WriteLine("Invariant");
                Array.Sort<string>(strs, StringComparer.InvariantCulture);
                Console.WriteLine(String.Join(" < ", strs));
            }
     
    比较结果
    en-US
    a < A < aaa < ab < aB < Ab < AB < abc < b < B
    zh-CN
    a < A < aaa < ab < aB < Ab < AB < abc < b < B
    Ordinal
    A < AB < Ab < B < a < aB < aaa < ab < abc < b
    Invariant
    a < A < aaa < ab < aB < Ab < AB < abc < b < B
      
     
    总结
    支持多种CultureInfo是整个.NET Framework更加人性化,因为这可以使同一个数据适应不同地区和文化,这样当然满足处于不同地区和文化的用户,但前提是数据给“人”看,如果这些数据用于计算机之间的传输,即给“机器”看,这样的多文化处理反而不妥,造成同一个数据的不同展现形式,尤其是读写两方的文化地区不同时,数据可能根本无法被正常读取或者产生潜在bug,因此这里,正是InvariantCulture的用武之地。
  • 相关阅读:
    编译预处理命令define
    共享数据的包含const
    友元类,友元函数
    静态成员static
    this 指针
    构造函数与析构函数
    c++类的基础
    void指针和const指针
    c++基础
    组播的实现
  • 原文地址:https://www.cnblogs.com/zhuiyi/p/3006463.html
Copyright © 2020-2023  润新知