20.4 CultureInfo类
CultureInfo类在System.Globalization命名空间中是一个非常重要的类,它为每个区域性指定一个唯一的名称,它包含了区域性特定的信息,例如语言、国家/地区、日历以及区域性约定。同时,它还提供执行区域性特定的操作(如大小写转换、格式化日期和数字以及比较字符串)所需的信息。
除此之外,CultureInfo类还提供对DateTimeFormatInfo、NumberFormatInfo、CompareInfo和TextInfo的区域性特定实例的访问。这些对象包含区域性特定操作(如大小写、格式化日期和数字以及比较字符串)所需的信息。
20.4.1 CultureInfo类的方法
CultureInfo类提供许多非常有用的方法,如表20-1所示。
例如,下面的示例代码使用GetCultures方法检索所有区域性的完整列表。
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder str=new StringBuilder();
str.Append("<table>");
foreach(CultureInfo ci in
CultureInfo.GetCultures(CultureTypes.AllCultures))
{
str.Append("<tr><td>"+ci.Name
+"</td><td>"+ci.TwoLetterISOLanguageName
+"</td><td>"+ci.ThreeLetterISOLanguageName
+"</td><td>"+ci.DisplayName
+"</td><td>"+ci.EnglishName
+"</td></tr>");
}
str.Append("</table>");
Response.Write(str.ToString());
}
运行结果如图20-9所示。
图 20-9 GetCultures示例运行结果
20.4.2 CurrentCulture属性
CurrentCulture属性表示每个线程的当前区域性信息,该信息确定了日期、时间、货币和数字的默认格式,文本的排序顺序,字符串比较方式以及大小写。
若要更改线程使用的区域性,应用程序应将Thread.CurrentCulture设置为新的区域性。更改Thread.CurrentThread的区域性时需要具备设置了ControlThread值的SecurityPermission。由于安全状态与线程关联,对线程进行操作是危险的。因此,应只向可信代码授予该权限,并且只在必要的时候才授予该权限。在不完全受信任的代码中,应用程序不能更改线程区域性。
例如,下面的示例代码将该属性设置为特定区域性英语(美国),即“en-US”。
Thread.CurrentThread.CurrentCulture=new CultureInfo("en-US");
实际上,应用程序必须使用特定区域性来初始化CurrentCulture属性。该属性要求区域性同时与语言和国家/地区关联,如英语(美国),即“en-US”。由于一种语言往往在多个国家/地区使用,因此需要区域信息来确定要使用的适当格式化约定。例如,如果应用程序指定表示非特定英语的区域性“en”,则对于日期或货币格式,没有唯一正确的设置。日期可能是美国格式,也可能是英国格式。货币可能是新西兰格式,也可能是加拿大格式。因此,如果应用程序尝试通过指定非特定区域性来设置CurrentCulture属性,将引发异常。
但在某些特殊的情况下,只能够访问非特定区域性。那么在这个时候,就可以在应用程序中使用CreateSpecificCulture方法来以CurrentCulture期望的格式创建一个CultureInfo对象。该方法首先将非特定区域性映射到关联的默认特定区域性,然后创建一个表示该特定区域性的CultureInfo对象。
例如,下面的示例代码将使用CreateSpecificCulture方法将非特定区域性英语(“en”)映射到特定区域性英语(美国),即“en-US”。然后,它为“en-US”创建了一个CultureInfo对象,并使用该对象来初始化CurrentCulture属性的值。如下面的代码所示:
Thread.CurrentThread.CurrentCulture=
CultureInfo.CreateSpecificCulture("en");
另外,CreateSpecificCulture方法还有一个强大的功能,它允许应用程序使用Web浏览器的当前语言来初始化ASP.NET页面中的CurrentCulture属性。如下面的示例代码所示:
Thread.CurrentThread.CurrentCulture=
CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
其中,UserLanguages属性以字符串形式检索Web浏览器的当前语言。CreateSpecificCulture方法分析此字符串,并以可用于初始化CurrentCulture属性值的格式返回一个CultureInfo对象。
其实,除了上面的两种方法之外,还可以采取隐式方式来设置CurrentCulture属性的值。在Windows操作系统中,GetUserDefaultLCID函数用于设置CurrentCulture属性。因此,用户可以通过在“控制面板”的“区域和语言选项”中更改用户区域性,或者通过更改与用户区域设置相关的设置(如货币、数字、日期和时间格式)来更改CurrentCulture属性。
20.4.3 CurrentUICulture属性
CurrentUICulture属性表示每个线程的当前用户界面区域性。可以在应用程序中使用非特定区域性、特定区域性或InvariantCulture来设置CurrentUICulture属性。如下面的示例代码所示:
//设置为非特定区域性英语
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en");
//设置为特定区域性英语(美国)
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
20.4.4 InvariantCulture属性
该属性既不表示非特定区域性,也不表示特定区域性,它表示第三种类型的区域性—固定区域性。它与英语语言关联,但不与任何国家/地区关联。
在应用程序中,System.Globalization命名空间内几乎所有要求区域性的方法,都可以使用该属性。但是,应用程序只应将固定区域性用于需要与区域性无关的结果的进程,如对保存到文件中的数据进行格式设置和分析等。而在其他情况下,它所产生的结果可能在语言上不正确或在文化上不合适。
下面的代码示例演示了如何用空字符串("")或InvariantCulture来初始化具有固定区域性的CultureInfo对象:
//用空字符串("")来初始化具有固定区域性的CultureInfo对象
CultureInfo ci=new CultureInfo("");
//用InvariantCulture来初始化具有固定区域性的CultureInfo对象
CultureInfo ci2=CultureInfo.InvariantCulture;
20.4.5 其他属性
除了上述的三个属性之外,CultureInfo类还提供许多其他有用的属性,如表20-2所示。
在表20-2中,CultureTypes属性用于获取属于当前CultureInfo对象的区域性类型,该区域类型是一个System.Globalization.CultureTypes枚举。其枚举值如表20-3所示。