次の方法で共有


Visual Basic でのカルチャの文字列への影響

このヘルプ ページでは、Visual Basic でカルチャ情報を使用して文字列変換と比較を実行する方法について説明します。

Culture-Specific 文字列を使用するタイミング

通常は、ユーザーに提示およびユーザーからの読み取りを行うすべてのデータにカルチャ固有の文字列を使用し、アプリケーションの内部データにはカルチャに依存しない文字列を使用する必要があります。

たとえば、アプリケーションでユーザーに文字列として日付を入力するよう求める場合、ユーザーはカルチャに従って文字列を書式設定し、アプリケーションは文字列を適切に変換する必要があります。 その後、アプリケーションがその日付をユーザー インターフェイスに表示する場合は、ユーザーのカルチャでその日付を表示する必要があります。

ただし、アプリケーションが中央サーバーに日付をアップロードする場合は、異なる可能性のある日付形式間の混乱を防ぐために、1 つの特定のカルチャに従って文字列を書式設定する必要があります。

Culture-Sensitive 関数

すべての Visual Basic 文字列変換関数 ( Str 関数と Val 関数を除く) は、アプリケーションのカルチャ情報を使用して、変換と比較がアプリケーションのユーザーのカルチャに適していることを確認します。

カルチャ設定が異なるコンピューターで実行されるアプリケーションで文字列変換関数を正常に使用するには、どの関数が特定のカルチャ設定を使用し、どの関数が現在のカルチャ設定を使用するかを理解することが重要です。 アプリケーションのカルチャ設定は、既定ではオペレーティング システムのカルチャ設定から継承されていることに注意してください。 詳細については、「 AscAscWChrChrWFormatHexOctおよび型変換関数」を参照してください。

Str (数値を文字列に変換) およびVal (文字列を数値に変換) 関数は、文字列と数値の間で変換するときにアプリケーションのカルチャ情報を使用しません。 代わりに、ピリオド (.) のみを有効な小数点区切り記号として認識します。 これらの関数の文化的に認識される類似体は次のとおりです。

  • 現在のカルチャを使用する変換。 CStr関数とFormat関数は数値を文字列に変換し、CDbl関数とCInt関数は文字列を数値に変換します。

  • 特定のカルチャを使用する変換。 各数値オブジェクトには、数値を文字列に変換する ToString(IFormatProvider) メソッドと、文字列を数値に変換する Parse(String, IFormatProvider) メソッドがあります。 たとえば、 Double 型は、 ToString(IFormatProvider) メソッドと Parse(String, IFormatProvider) メソッドを提供します。

詳細については、「StrVal」を参照してください。

特定のカルチャの使用

日付 (文字列形式) を Web サービスに送信するアプリケーションを開発しているとします。 この場合、アプリケーションは文字列変換に特定のカルチャを使用する必要があります。 その理由を説明するために、日付の ToString() メソッドを使用した結果を検討してください。アプリケーションでそのメソッドを使用して日付を 7 月 4 日に書式設定する場合は、 2005 年 2005 年 7 月 4 日 12:00:00 AM は、米国英語 (en-US) カルチャで実行すると "04.07.2005 00:00:00" を返しますが、ドイツ語 (de-DE) カルチャで実行すると "04.07.00:00" が返されます。

特定のカルチャ形式で文字列変換を実行する必要がある場合は、.NET Framework に組み込まれている CultureInfo クラスを使用する必要があります。 カルチャの名前を CultureInfo コンストラクターに渡すことで、特定のカルチャの新しいCultureInfo オブジェクトを作成できます。 サポートされているカルチャ名は、 CultureInfo クラスのヘルプ ページに一覧表示されます。

または、CultureInfo.InvariantCulture プロパティからインバリアント カルチャのインスタンスを取得することもできます。 インバリアント カルチャは英語のカルチャに基づいていますが、いくつかの違いがあります。 たとえば、インバリアント カルチャでは、12 時間制ではなく 24 時間制を指定します。

日付をカルチャの文字列に変換するには、 CultureInfo オブジェクトを日付オブジェクトの ToString(IFormatProvider) メソッドに渡します。 たとえば、次のコードでは、アプリケーションのカルチャ設定に関係なく、"07/04/2005 00:00:00" と表示されます。

Dim d As Date = #7/4/2005#
MsgBox(d.ToString(System.Globalization.CultureInfo.InvariantCulture))

日付リテラルは、常に英語のカルチャに従って解釈されます。

文字列の比較

文字列比較が必要な場合は、次の 2 つの重要な状況があります。

  • ユーザーに表示するデータの並べ替え。 文字列が適切に並べ替えられるように、現在のカルチャに基づく操作を使用します。

  • 2 つのアプリケーション内部文字列が完全に一致するかどうかを判断する (通常はセキュリティ目的)。 現在のカルチャを無視する操作を使用します。

両方の種類の比較を Visual Basic StrComp 関数と実行できます。 比較の種類を制御する省略可能なCompare引数を指定します。ほとんどの入力と出力のBinaryText完全一致を判断します。

StrComp関数は、並べ替え順序に基づいて比較された 2 つの文字列間のリレーションシップを示す整数を返します。 結果の正の値は、最初の文字列が 2 番目の文字列より大きいことを示します。 負の結果は、最初の文字列が小さい場合を示し、0 は文字列間の等価性を示します。

' 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 では、インバリアント カルチャ情報を使用して、大文字と小文字のみが異なる 2 つの文字がいつ異なるかを判断します。
この値は、大文字と小文字を区別しない識別子、セキュリティ関連の設定、および Windows に格納されているデータを比較する場合に使用します。
CurrentCulture または CurrentCultureIgnoreCase 現在のカルチャでの文字列の解釈に基づく比較。 比較する場合は、次の値を使用します。ユーザーに表示されるデータ、ほとんどのユーザー入力、および言語的な解釈を必要とするその他のデータ。
InvariantCulture または InvariantCultureIgnoreCase インバリアント カルチャでの文字列の解釈に基づく比較。

インバリアント カルチャでは、許容される範囲外の文字が同等の不変文字として扱われるため、これは Ordinal および OrdinalIgnoreCaseとは異なります。
これらの値は、永続化データを比較する場合、または固定の並べ替え順序を必要とする言語的に関連するデータを表示する場合にのみ使用します。

セキュリティに関する考慮事項

アプリケーションが比較操作または大文字と小文字の変更操作の結果に基づいてセキュリティ上の決定を行う場合、操作では String.Compare メソッドを使用し、comparisonType引数にOrdinalまたはOrdinalIgnoreCaseを渡す必要があります。

こちらも参照ください