CultureInfo简述

CultureInfo类位于System.Globalization命名空间内,这个类和这个命名空间许多人都不了解也认为不需要太多了解,实际上,你写的程序中会经常间接得使用这些类。

简单的说:当进行数字,日期时间,字符串匹配时,都会进行CultureInfo的操作,也就是不同的CultureInfo下,这些操作的结果可能会不一样。这里要介绍一下非常容易被忽视的InvariantCulture。

通过示例了解InvariantCulture

前面提到过,不同的CultureInfo会影响某些函数的执行结果,.NET中有一个特殊的CultureInfo:InvariantCulture,这个CultureInfo有点像英语格式,但它不和国家地区挂钩,它可以提供一个可靠的在多语言环境下的规范格式化。

比如你编写一个程序,要向数据中心服务器传递一些时间数据,你会怎么写?直接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));

这样不管客户端运行在什么语言环境下,输出的时间格式都是统一的,方面数据中心服务器对数据做后续处理。

(当然这个例子仅用来演示InvariantCulture的用法,是否存在其他不妥处这里不做讨论)

InvariantCulture和字符串比较

下面代码进行四种字符串比较方法,分别是zh-cn, en-us文化,数值比较和InvariantCulture比较(全部是区分大小写)。

static void Main()
{string[] strs = { "a", "A", "b", "B", "abc", "ab", "aB", "AB", "Ab", "aaa", "00", "0001", "002", "a4", "a9", "a33" };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
00 < 0001 < 002 < a < A < a33 < a4 < a9 < aaa < ab < aB < Ab < AB < abc < b < B
zh-CN
00 < 0001 < 002 < a < A < a33 < a4 < a9 < aaa < ab < aB < Ab < AB < abc < b < B
Ordinal
00 < 0001 < 002 < A < AB < Ab < B < a < a33 < a4 < a9 < aB < aaa < ab < abc < b
Invariant
00 < 0001 < 002 < a < A < a33 < a4 < a9 < aaa < ab < aB < Ab < AB < abc < b < B

(下面全部是区分大小写)

Ordinal是传统比较方式,即比较每个字符的数值,如果相等的话,继续比较下一组,如果有一个没有的话,长度大的算大。

Invariant和大多数CultureInfo都用一种更人性化的比较方法。首先判断一组字符是否是不一样(这里不区分大小写),直接返回结果如果不一样,因此b>AB,B>abc。如果一样的话比较下一组,如果都一样则比较长度,所以abc>AB>ab,如果长度都一样最后再比较大小写,另外一个字符大写永远大于小写,所以AB>Ab>aB>ab

更新:

那么InvariantCulture这样比较字符串有什么作用呢?我觉得这样输出形式可读性更高,其实InvariantCulture比较字符串就是先进行一次不区分大小写的Ordinal比较(不过这里大写字母>小写字母),如果结果不相同的话在进行一遍区分大小写的Ordinal比较(同样这里也是大写字母>小写字母)。这样可以将字符串先进行一次大的筛选,然后再比较细节,看下面的示例,Ordinal和InvariantCulture的比较结果可读性更高!

string[] arr = { "Ab", "aB", "AB", "ab", "Abccccccc", "aBccccc", "Abd" };Array.Sort<string>(arr, StringComparer.Ordinal);
Console.WriteLine(String.Join("\n", arr));Console.WriteLine();
Array.Sort<string>(arr, StringComparer.InvariantCulture);
Console.WriteLine(String.Join("\n", arr));

比较结果:

Ordinal InvariantCulture
AB
Ab
Abccccccc
Abd
aB
aBccccc
ab
ab
aB
Ab
AB
aBccccc
Abccccccc
Abd

结果显而易见,Ordinal机器式的纯数值比较,上面的Ordinal排序结果看起来还是很乱,而InvariantCulture则可读性更高。

返回目录

总结

支持多种CultureInfo是整个.NET Framework更加人性化,因为这可以使同一个数据适应不同地区和文化,这样当然满足处于不同地区和文化的用户,但前提是数据给“人”看,如果这些数据用于计算机之间的传输,即给“机器”看,这样的多文化处理反而不妥,造成同一个数据的不同展现形式,尤其是读写两方的文化地区不同时,数据可能根本无法被正常读取或者产生潜在bug,因此这里,正是InvariantCulture的用武之地。

转载于:https://www.cnblogs.com/BMFramework/p/10017311.html

CultureInfo中重要的InvariantCulture相关推荐

  1. C# CultureInfo中常用的InvariantCulture

    C# CultureInfo中常用的InvariantCulture 本文参考自CultureInfo中重要的InvariantCulture,纯属读书笔记,加深记忆 1.CultureInfo的In ...

  2. 【转】CultureInfo中重要的InvariantCulture

    原贴地址:http://www.soaspx.com/dotnet/csharp/csharp_20110506_7607.html CultureInfo简述 CultureInfo类位于Syste ...

  3. CultureInfo中linux下AllCultures中无zh-CN的问题

    CultureInfo类型 含义   NeutralCulture Neutral cultures are cultures like "en", "de", ...

  4. .NET(C#):ToString(CultureInfo.InvariantCulture)

    .NET(C#):CultureInfo中重要的InvariantCulture 目录 CultureInfo简述 通过示例了解InvariantCulture InvariantCulture和字符 ...

  5. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  6. 面试:第十二章:所有总结

    Java基础 java基本类型哪些,所占字节 byte :1个字节 short :2个字节 char :2个字节 int :4个字节 long :8个字节 float :4个字节 double :8个 ...

  7. linux内核分析(转自某位大哥网上的笔记)

    启动 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码.BIOS先进行一系列的系统自检,然后初始化位于地址0的中断 ...

  8. C#中的CultureInfo类

    CultureInfo类位于System.Globalization命名空间内,这个类和命名空间许多人都不是很熟悉,实际我们在写程序写都经常间接性的接触这个类,当进行数字,日期时间,字符串匹配时,都会 ...

  9. C# CultureInfo.InvariantCulture

    今天在写代码的过程中发现了一个有意思的问题,我在写了一个日期格式转化的时候发现不同电脑的运行结果不一致. 代码如下 string str = this.tbTime.Text;if(string.Is ...

最新文章

  1. pandas数据框,统计某列或者某行数据元素的个数
  2. Python爬虫之破解百度翻译--requests案例详解(二)
  3. 学习canvas 过程中的几点总结
  4. 级联模60计数器(Verilog HDL语言描述)(仿真与综合)
  5. wps 选择 高亮_WPS的这些功能,竟然如此好用
  6. org.activiti.bpmn.exceptions.XMLException: src-resolve: 无法将名称 'extension' 解析为 'element declaration'
  7. Linux基础二(挂载、关机重启与系统等级)
  8. MySQL笔记(四)多表连接查询
  9. Python入门(04) -- 函数
  10. 关于Spring的几个问题
  11. 各种手机的UserAgent大全
  12. 无穷大8字型曲线方程
  13. 小米 note3 android,小米Note3将更新MIUI10:基于安卓8.1 速度提升明显手感更加丝滑...
  14. swift搭建苹果软件模版代码
  15. RPM命令详解(安装、升级、卸载)
  16. 「英语六级作文」整体框架-Essay Map
  17. 初体验scrapy-爬取豆瓣250电影数据
  18. ubuntu16.04 设置双显示器屏幕
  19. Android studio 如何连接手机
  20. 文献(5): 单细胞转录组揭示人类纤维化皮肤病中成纤维细胞的异质性

热门文章

  1. 天猫用户重复购买预测——数据探索
  2. 精益生产25个必备工具!
  3. Java - 为什么不能根据返回类型来区分重载?
  4. 设计一个长方体类Cuboid(Java)
  5. [英语学习]圣经英文读经计划
  6. MATLAB连连看小游戏
  7. 常用正则以及正则学习(整理)
  8. I - Modulo Permutations (SEERC 2020)
  9. 实现证件照APP(一)
  10. pycharm导入第三方库的两种方法(永不报错)