区域性对字符串的影响 (Visual Basic)
此帮助页讨论 Visual Basic 如何使用区域性信息来执行字符串转换和比较。
何时使用特定于区域性的字符串
通常,应该对提供给用户和从用户输入中读取的所有数据使用特定于区域性的字符串,而对应用程序的内部数据使用区域性固定的字符串。
例如,如果应用程序要求用户以字符串形式输入日期,则应预计到用户会根据各自的区域性对字符串进行格式设置,因此,应用程序应适当地转换字符串。 如果应用程序随后在其用户界面中呈现日期,则应按照用户的区域性来呈现。
但是,如果应用程序将日期上载到中央服务器,则应依据某个特定的区域性来设置字符串格式,以防止在可能不同的日期格式间出现混淆。
区分区域性的函数
所有 Visual Basic 字符串转换函数(除 Str 和 Val 函数外)都使用应用程序的区域性信息,以确保转换和比较适合于应用程序用户的区域性。
在运行于具有不同区域性设置的计算机上的应用程序中成功使用字符串转换函数的关键在于:了解哪些函数使用特定的区域性设置,哪些函数使用当前区域性设置。 请注意,应用程序的区域性设置默认情况下是从操作系统的区域性设置中继承的。 有关更多信息,请参见 Asc、AscW、Chr、ChrW、Format、Hex、Oct 和 类型转换函数 (Visual Basic)。
在字符串和数字之间进行转换时,Str(将数字转换为字符串)以及 Val(将字符串转换为数字)函数不使用应用程序的区域性信息。 相反,它们只将句点 (.) 识别为有效的小数点分隔符。 与这些函数类似的可识别区域性的函数包括:
**使用当前区域性的转换。**CStr 和 Format 函数将数字转换为字符串,而 CDbl 和 CInt 函数将字符串转换为数字。
**使用特定区域性的转换。**每个数字对象都有一个将数字转换为字符串的 ToString(IFormatProvider) 方法,以及一个将字符串转换为数字的 Parse(String, IFormatProvider) 方法。 例如,Double 类型提供了 ToString(IFormatProvider) 和 Parse(String, IFormatProvider) 方法。
使用特定区域性
假设您正在开发一个将日期(设置为字符串格式)发送到 Web 服务的应用程序。 在这种情况下,应用程序必须为字符串转换使用特定区域性。 为了阐述原因,请考虑一下使用日期的 ToString() 方法的结果:如果应用程序使用该方法来设置日期“2005 年 7 月 4 日”的格式,在使用美国英语 (en-US) 区域性运行时,它将返回“7/4/2005 12:00:00 AM”,但在使用德语 (de-DE) 区域性运行时,它将返回“04.07.2005 00:00:00”。
在需要采用特定区域性格式执行字符串转换时,应使用 .NET Framework 内置的 CultureInfo 类。 通过将区域性的名称传递到 CultureInfo 构造函数,您可以为某个特定区域性创建新的 CultureInfo 对象。 CultureInfo 类的“帮助”页中列出了支持的区域性名称。
或者,您可以从 CultureInfo.InvariantCulture 属性中获取固定区域性的实例。 虽然固定区域性基于英语区域性,但也存在一些差异。 例如,固定区域性指定 24 小时制,而不是 12 小时制。
若要将日期转换为与区域性对应的字符串,请将 CultureInfo 对象传递到日期对象的 ToString(IFormatProvider) 方法。 例如,无论应用程序的区域性设置如何,以下代码都会显示“07/04/2005 00:00:00”。
Dim d As Date = #7/4/2005#
MsgBox(d.ToString(System.Globalization.CultureInfo.InvariantCulture))
提示
将总是依据英语区域性解释日期文本。
比较字符串
在以下两种很重要的情况下,需要进行字符串比较:
**对数据进行排序,以便向用户显示。**使用基于当前区域性的运算,以使字符串正确排序。
**确定两个应用程序内部字符串是否完全匹配(通常用于安全目的)。**使用不考虑当前区域性的运算。
使用 Visual Basic StrComp 函数可以执行这两种类型的比较。 指定可选参数 Compare 可控制比较的类型:对于大多数输入和输出,可指定 Text,如果要确定是否完全匹配,可指定 Binary。
StrComp 函数返回一个整数,该整数指示所比较的两个字符串之间基于排序顺序的关系。 正数结果值指示第一个字符串大于第二个字符串。 负数结果指示第一个字符串较小,而零指示两个字符串相等。
' Defines variables.
Dim TestStr1 As String = "ABCD"
Dim TestStr2 As String = "abcd"
Dim TestComp As Integer
' The two strings sort equally. Returns 0.
TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Text)
' TestStr1 sorts after TestStr2. Returns -1.
TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Binary)
' TestStr2 sorts before TestStr1. Returns 1.
TestComp = StrComp(TestStr2, TestStr1)
也可以使用 .NET Framework 中与 StrComp 函数对应的 String.Compare 方法。 这是基字符串类的静态重载方法。 下面的示例阐释如何使用此方法:
Dim myString As String = "Alphabetical"
Dim secondString As String = "Order"
Dim result As Integer
result = String.Compare(myString, secondString)
为了更细致地控制比较的执行方式,您可以使用 Compare 方法的附加重载。 利用 String.Compare 方法,您可以使用 comparisonType 参数来指定要使用哪种比较方式。
comparisonType 参数的值 |
比较类型 |
何时使用 |
Ordinal |
基于字符串组成部分字节数的比较。 |
在比较以下各项时使用此值:区分大小写的标识符、与安全相关的设置或者字节数必须完全匹配的其他非语言标识符。 |
OrdinalIgnoreCase |
基于字符串组成部分字节数的比较。 OrdinalIgnoreCase 使用固定区域性信息来确定两个字符在什么情况下只是大小写不同。 |
在比较以下各项时使用此值:不区分大小写的标识符、与安全相关的设置以及 Windows 中存储的数据。 |
CurrentCulture 或 CurrentCultureIgnoreCase |
基于字符串在当前区域性中的解读的比较。 |
在比较以下各项时使用这些值:向用户显示的数据、大多数用户输入以及需要语言学解读的其他数据。 |
InvariantCulture 或 InvariantCultureIgnoreCase |
基于字符串在固定区域性中的解读的比较。 此类型与 Ordinal 和 OrdinalIgnoreCase 不同,因为固定区域性将其接受范围外的字符视为等效的固定字符。 |
只有在比较持久数据或显示需要固定排序顺序的语言相关数据时,才使用这些值。 |
安全注意事项
如果应用程序根据比较或大小写转换运算的结果制定安全决策,则运算应使用 String.Compare 方法,并为 comparisonType 参数传递 Ordinal 或 OrdinalIgnoreCase。