区域性对字符串的影响 (Visual Basic)

此帮助页讨论 Visual Basic 如何使用区域性信息执行字符串转换和比较。

何时使用区域性特定的字符串

通常,对于呈现给用户和从用户处读取的所有数据,应使用特定于区域性的字符串,对于应用程序的内部数据,应使用区域性不变的字符串。

例如,如果应用程序要求用户以字符串形式输入日期,它会预期用户根据其区域性设置字符串的格式,并且应用程序应适当地转换字符串。 如果应用程序随后在其用户界面中显示该日期,应以用户的区域性显示该日期。

但是,如果应用程序将日期上传到中央服务器,它应根据一个特定的区域性来设置字符串的格式,以防止在可能出现的不同日期格式之间产生混淆。

区域性敏感功能

所有 Visual Basic 字符串转换函数(除了 StrVal 函数)都使用应用程序的区域性信息,以确保转换和比较与应用程序用户的区域性相适。

在具有不同区域性设置的计算机上运行的应用程序中成功使用字符串转换函数的关键是了解哪些函数使用特定区域性设置,哪些函数使用当前区域性设置。 请注意,默认情况下,应用程序的区域性设置继承自操作系统的区域性设置。 有关详细信息,请参阅 AscAscWChrChrWFormatHexOct类型转换函数

在字符串和数字之间转换时,Str(将数字转换为字符串)和 Val(将字符串转换为数字)函数不使用应用程序的区域性信息。 它们只将句点 (.) 识别为有效的小数分隔符。 在区域性感知方面与这些函数类似的函数包括:

  • 使用当前区域性的转换。 CStrFormat 函数将数字转换为字符串,CDblCInt 函数将字符串转换为数字。

  • 使用特定区域性的转换。 每个 number 对象都有一个将数字转换为字符串的 ToString(IFormatProvider) 方法,以及一个将字符串转换为数字的 Parse(String, IFormatProvider) 方法。 例如,Double 类型提供 ToString(IFormatProvider)Parse(String, IFormatProvider) 方法。

有关详细信息,请参阅 StrVal

使用特定区域性

假设你正在开发一个向 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 中的数据。
CurrentCultureCurrentCultureIgnoreCase 基于字符串在当前区域性下的解释进行比较。 在比较以下内容时使用这些值:向用户显示的数据、大多数用户输入以及需要语言学解读的其他数据。
InvariantCultureInvariantCultureIgnoreCase 基于字符串在固定区域性下的解释进行比较。

这不同于 OrdinalOrdinalIgnoreCase,因为固定区域性将超出其接受范围的字符视为等效的不变字符。
仅当比较持久数据或显示需要固定排序顺序的语言相关数据时使用这些值。

安全注意事项

如果应用程序根据比较或大小写更改操作的结果做出安全决策,那么该操作应使用 String.Compare 方法,并将 OrdinalOrdinalIgnoreCase 传递给 comparisonType 参数。

另请参阅