国际排序顺序和字符串比较

字符串比较在 Visual Basic 中应用很广。然而使用此功能时,如果忽略某些编程要求,有可能导致错误的结果。

文本排序

文本排序的意思是根据语言惯例对文本排序。由于格式和字体只代表表示形式而不是内容,因此它们与排序过程无关。乍看起来,文本排序看似简单:a 优先于 bb 优先于 c,等等。然而,很多语言具有很复杂的排序规则。正确的国际排序不是英文文本排序的简单扩展,因此需要对排序过程有不同的理解。

正确的国际排序的意思是上下文相关排序。字符收缩和扩展是上下文相关排序的两个重要方面。

在进行排序顺序之前,必须考虑代码页。代码页是一顺序字符集,由一数字索引(代码指针)指向其中的每一个字符。因为有各种各样的代码页,所以单个代码指针在不同代码页中代表不同的字符。然而很多代码页共享代码指针 32 至 127(ASCII 字符集),除此之外,它们是不同的。通常,代码页中其它额外字母不是按字母排序的。

详细信息 关于东亚语言排序顺序的详细信息,请参阅本章后面的“DBCS 排序顺序和字符串比较”。

Visual Basic 中的字符串比较

每个国家/地区的字符串比较规则不同。Visual Basic 提供了许多具有区域识别功能的字符串比较工具,例如 Like 和 StrComp。 为了有效使用这些工具,首先必须清楚地了解 Option Compare 语句。

用 Option Compare 语句比较字符串

使用此语句时,对给定的模块必须指定字符串的比较方法:Binary 或 Text。如果指定 Binary,则根据代表字符的内部二进制码的排序顺序进行字符串比较。如果指定 Text,则根据由用户系统区域决定的不区分大小写的文本排序顺序完成字符串比较。缺省的文本比较方法是 Binary。

在下面的代码示例中,用户在两个输入框中输入信息。接着,按适当的字母顺序进行信息的比较和排序。

Private Sub Form_Click ()
Dim name1 As String, name2 As String
   name1 = InputBox("Enter 1st hardware name here:")
   name2 = InputBox("Enter 2nd hardware name here:")
If name1 < name2 Then
   msg = " ' " & name1 & " ' comes before ' " & _
   name2 & " ' "
Else
   msg = " ' " & name2 & " ' comes before ' " & _
   name1 & " ' "
End If
   MsgBox msg
End Sub

如果该代码在区域为英语/美国的系统下运行,输入 printer Screen,则消息框内的输出如下:

'Screen' comes before 'printer'

这是基于缺省的文本比较方法为 Binary 时的结果。因为大写 S 的内部二进制代码小于小写 p 的内部二进制代码,所以条件语句 Screen < printer 被确认。当在模块的声明区内增加 Option Compare Text 语句后,Visual Basic 按不区分大小写的方法比较这两个字符串,输出结果如下:

'printer' comes before 'Screen'

如果该代码在区域为法语/加拿大的系统下运行,而且输入 imprimante écran,则消息框内的输出如下:

'imprimante' comes before 'écran'

同样,如果在代码中增加 Option Compare Text 语句,则这两项以正确的顺序出现—即 écran 先于 imprimante。此外,由于不区分大小写,比较时应考虑重音字符,例如法语中的 é,排序时将它紧排在其标准字符之后—此时是 e

如果输入 ecranécran,输出将是:

'ecran' comes before 'écran'

详细信息 请参阅《语言参考》的“Option Compare 语句”。

用 Like 操作符比较字符串

可以使用 Like 操作符比较两个字符串。也可以使用其模式匹配功能。当编写国际化软件时,必须考虑模式匹配功能。当字符范围使用 Like 时,指定的模式表示排序顺序范围。例如,用 Binary 方法比较字符串时(通过设置缺省值或通过在代码中添加 Option Compare Binary),字符范围 [A – C] 将忽略大写重读 a 字符和所有小写字符。只有以 A、B 和 C 开头的字符串才能与之匹配。而在很多语言中却不是这样。例如德语中,上述范围将忽略所有以 ?开头的字符串。在法语中,则忽略所有以 à 开头的字符串。

使用 Text 方法比较字符串时,所有重音 A 和 a 字符将包含在内。然而在区域为法语/法国中,由于 ? 和 ? 在排序顺序中出现在 C 和 c 之后,所以以 ? 或 ? 开头的字符串不包含在内。

在某些区域里,利用 [A - Z] 范围来选定所有以字母字符开头的字符串并不是一种有效的方法。如果在区域为丹麦语/丹麦的系统下运行应用程序,用 Text 方法比较字符串时,以 ? 和 ? 开头的字符串不包含在此范围内。虽然这两个字符是丹麦语字符的一部分,但它们排在 Z 之后。因此,应在 Z 之后增加这些字母。例如,用 Option Compare Text 语句比较字符串时,Print "?l" Like "[A-Z]*" 将返回 False,但是 Print "?l" Like "[A-Z?]*" 将返回 True。

用 StrComp 函数比较字符串

用 StrComp 函数比较字符串很有用。它的返回值表明某一字符串是否小于、等于或大于另一字符串。返回值也与用 Option Compare 语句定义的字符串比较方法(Binary 或 Text)有关。在比较同一字符串时,根据定义的字符串比较方法不同,StrComp 的返回值也不同。

详细信息 关于东亚语言字符串比较的详细信息,请参阅本章后面的“DBCS 排序顺序和字符串比较”一节。也可参阅《语言参考》的“StrComp 函数”。