本帮助页讨论 Visual Basic 如何使用区域性信息来执行字符串转换和比较。
何时使用 Culture-Specific 字符串
通常,应为提供给用户和从用户那里读取的所有数据使用文化特定的字符串,并为应用程序的内部数据使用文化不变的字符串。
例如,如果应用程序要求用户输入日期作为字符串,它应该期望用户根据其区域性设置字符串的格式,并且应用程序应相应地转换字符串。 如果应用程序随后在其用户界面中显示该日期,则应将其呈现在用户的文化背景中。
但是,如果应用程序将日期上传到中央服务器,则应根据一个特定区域性设置字符串的格式,以防止潜在的不同日期格式之间的混淆。
区域性敏感功能
所有 Visual Basic 字符串转换函数(除了 Str
和 Val
函数)都使用应用程序的区域性信息来确保转换和比较适用于应用程序用户的区域性。
在具有不同区域性设置的计算机上运行的应用程序中成功使用字符串转换函数的关键是了解哪些函数使用特定的区域性设置,以及哪些函数使用当前区域性设置。 请注意,默认情况下,应用程序的区域性设置继承自操作系统的区域性设置。 有关详细信息,请参阅Asc、、AscW、ChrChrW、FormatHex、Oct和类型转换函数。
在字符串和数字之间转换时,Str
(将数字转换为字符串)和 Val
(将字符串转换为数字)函数不使用应用程序的区域性信息。 相反,他们仅识别点号(.)为有效的小数分隔符。 在区域性感知方面与这些函数类似的函数包括:
使用当前区域性的转换。 和
CStr
Format
函数将数字转换为字符串,并且CDbl
函数CInt
将字符串转换为数字。使用特定区域性的转换。 每个 number 对象都有一个
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 before testStr2. Returns -1.
testComp = StrComp(testStr1, testStr2, CompareMethod.Binary)
' testStr2 sorts after testStr1. Returns 1.
testComp = StrComp(testStr2, testStr1, CompareMethod.Binary)
还可使用 StrComp
函数的 .NET Framework 等效方法 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 方法,并将 Ordinal
或 OrdinalIgnoreCase
传递给 comparisonType
参数。