【转】CultureInfo中重要的InvariantCulture

简介: 原贴地址:http://www.soaspx.com/dotnet/csharp/csharp_20110506_7607.html CultureInfo简述 CultureInfo类位于System.Globalization命名空间内,这个类和这个命名空间许多人都不了解也认为不需要太多了解,实际上,你写的程序中会经常间接得使用这些类。

原贴地址: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()?那你就大错特错了,下面用代码,举个非常形象的例子。在一个控制台里,模拟数据中心,然后放出多个线程,模拟客户端程序传递数据。

 

         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"  };
             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的用武之地。
目录
相关文章
|
开发工具 git
iterm2 oh-my-zsh 自动提示命令
iterm2 oh-my-zsh 自动提示命令
iterm2 oh-my-zsh 自动提示命令
|
开发工具 图形学 iOS开发
Unity与IOS⭐Unity接入IOS SDK的流程图
Unity与IOS⭐Unity接入IOS SDK的流程图
|
JavaScript 算法 开发工具
Github 2024-07-22 开源项目周报Top15
根据Github Trendings的统计,本周(2024年7月22日统计)共有15个项目上榜。按开发语言分类,上榜项目数量如下:Python项目最多,共7个;TypeScript项目4个;Rust和非开发语言项目各2个;Jupyter Notebook、C#、JavaScript和C++项目各1个。其中,《Hello 算法》是一本开源的数据结构与算法教程,采用动画图解和可运行代码示例,适合初学者。Prisma则为Node.js和TypeScript提供下一代ORM解决方案。其他项目涵盖文本编辑器、富文本编辑器、AI编码助手等多种应用。
242 1
|
域名解析 缓存 网络协议
关于错误ERR_NAME_NOT_RESOLVED
如果以上方法都未能解决问题,你可能需要联系你的网络管理员或互联网服务提供商以获取更多帮助,或者考虑尝试在不同的网络环境中访问网站。
4581 0
|
消息中间件 负载均衡 Kafka
kafka rebalance你真的了解吗
今天主要分享一下 kafka 的 rebalance,在 kafka 中,rebalance 是一个十分重要的概念,很多时候引发的一些问题可能都是由于 rebalance 引起的,rebalance 也就是再均衡,顾名思义,再均衡就是再次负载均衡,下面会对再均衡进行一个详细的描述。
671 3
|
安全 开发者
可行性研究报告模板
可行性研究报告模板
939 0
|
JSON 数据格式
非常实用的5种json数组去重方法,函数实现思路竟是chatgpt帮我写的!
你敢信这5种json数组去重方法的实现思路竟然是chatgpt写的,chatgpt对函数的理解也太准确了吧!
482 0
|
存储 API Android开发
Skia深入分析
原文出处:http://blog.csdn.net/hgl868/article/details/45583667 一、渲染层级从渲染流程上分,Skia可分为如下三个层级:1、指令层:SkPicture、SkDeferredCanvas->SkCanvas这一层决定需要执行哪些绘图操作,绘图操作的预变换矩阵,当前裁剪区域,绘图操作产生在哪些layer上,Layer的生成与合并。
4894 0
|
JavaScript
Vue CKEditor5 剪切板事件监听,贴贴事件拦截
Vue CKEditor5 剪切板事件监听,贴贴事件拦截
455 0

热门文章

最新文章