在 Visual Basic 中文化特性如何影響字串

本說明頁面討論 Visual Basic 如何使用文化特性 (Culture) 資訊來執行字串轉換和比較。

使用特定文化特性字串的時機

一般而言,您應該針對呈現給使用者及讀取自使用者的所有資料使用文化特性特定字串,並針對應用程式的內部資料使用不因文化特性而異字串。

例如,如果您的應用程式要求使用者輸入日期做為字串,則應預期使用者根據其文化特性來格式化字串,而應用程式則應該適當地轉換字串。 如果您的應用程式接著在其使用者介面中顯示該日期,其應該會在使用者的文化特性中呈現該日期。

不過,如果應用程式將日期上傳至中央伺服器,其應該根據一個特定文化特性來格式化字串,以避免在可能不同的日期格式之間造成混淆。

文化特性敏感性的函式

所有 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 物件傳遞至 date 物件的 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 引數。

另請參閱