Verwenden der InvariantCulture-Eigenschaft
Die CultureInfo.InvariantCulture-Eigenschaft ist weder eine neutrale noch eine bestimmte Kultur. Es handelt sich um einen dritten Kulturtyp, der kulturunabhängig ist. Die Eigenschaft ist mit der englischen Sprache verknüpft. Eine Verknüpfung mit einem Land oder einer Region besteht jedoch nicht. InvariantCulture kann in nahezu allen Methoden des System.Globalization-Namespace verwendet werden, die eine Kultur benötigen. Sie sollten die invariante Kultur jedoch nur für Verfahren verwenden, für die kulturunabhängige Ergebnisse benötigt werden, beispielsweise das Formatieren und Analysieren von Daten, die in einer Datei gespeichert werden. Anderenfalls werden möglicherweise sprachlich falsche oder kulturell unangemessene Ergebnisse erzeugt.
Sicherheitsüberlegungen
Wenn eine Sicherheitsentscheidung basierend auf dem Ergebnis eines Zeichenfolgenvergleichs oder der Änderung der Groß-/Kleinschreibung getroffen wird, sollten Sie anstelle von InvariantCulture einen Ordinalvergleich verwenden, bei dem die Groß-/Kleinschreibung ignoriert wird. Dies liegt daran, dass die Standardimplementierungen von Methoden wie String.Compare, String.ToUpper und String.ToLower die CultureInfo.CurrentCulture-Eigenschaft verwenden. Code, mit dem kulturabhängige Zeichenfolgenoperationen durchgeführt werden, kann Sicherheitslücken zur Folge haben, wenn CultureInfo.CurrentCulture geändert wird oder wenn sich die Kultur des Computers, auf dem der Code ausgeführt wird, von der Kultur unterscheidet, die vom Entwickler zum Testen des Codes verwendet wurde. Das vom Entwickler beim Schreiben einer Zeichenfolgenoperation erwartete Verhalten unterscheidet sich vom tatsächlichen Verhalten des Codes auf dem Computer, auf dem die Operation ausgeführt wird. Im Gegensatz dazu hängt ein Ordinalvergleich lediglich vom Binärwert der verglichenen Zeichen ab.
Zeichenfolgenoperationen
Um eine kulturabhängige Zeichenfolgenoperation auszuführen, die nicht vom Wert von CultureInfo.CurrentCulture beeinflusst wird, verwenden Sie eine Methode, die einen CultureInfo-Parameter akzeptiert und geben den Wert der CultureInfo.InvariantCulture-Eigenschaft für den CultureInfo-Parameter an. Verwenden Sie InvariantCulture mit Methoden, wie String.Compare, String.ToUpper und String.ToLower, um kulturelle Variationen auszuschließen und konsistente Ergebnisse zu gewährleisten. Weitere Informationen zum Ausführen von kulturunabhängigen Zeichenfolgenoperationen mithilfe der InvariantCulture-Eigenschaft finden Sie unter Kulturunabhängige Zeichenfolgenoperationen.
Beibehalten von Daten
InvariantCulture ist vor allem zum Speichern von Daten geeignet, die den Endbenutzern nicht direkt angezeigt werden. Das Speichern von Daten in einem kulturunabhängigen Format gewährleistet ein bekanntes Format, das sich nicht ändert. Wenn Benutzer aus unterschiedlichen Kulturen auf die Daten zugreifen, können diese für die jeweiligen Benutzer entsprechend formatiert werden. Wenn Sie beispielsweise DateTime-Typen in einer Textdatei mit dem Format für InvariantCulture speichern, verwenden Sie die InvariantCulture-Eigenschaft beim Aufrufen der DateTime.ToString-Methode zum Speichern der Zeichenfolgen und die Date.Parse-Methode, um die Zeichenfolgen abzurufen. Dadurch wird sichergestellt, dass die zugrunde liegenden DateTime-Typen sich nicht ändern, wenn die Daten von Benutzern verschiedener Kulturen gelesen oder geschrieben werden.
Im folgenden Beispiel wird die Initialisierung von CultureInfo mit der invarianten Kultur veranschaulicht, wobei eine leere Zeichenfolge ("") oder CultureInfo.InvariantCulture verwendet wird.
' The following lines are equivalent.
CultureInfo Invc = New CultureInfo("")
CultureInfo Invc = CultureInfo.InvariantCulture
// The following lines are equivalent.
CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture;
Im folgenden Codebeispiel wird gezeigt, wie ein DateTime-Typ mithilfe der DateTime.ToString-Methode als für die InvariantCulture formatierte Zeichenfolge in eine Datei geschrieben wird. Die Zeichenfolge wird dann aus der Datei im InvariantCulture-Format gelesen und mithilfe der Date.Parse-Methode zur Analyse an einen DateTime-Typ übergeben. DateTime wird daraufhin für die Kulturen "fr-FR" und "ja-JP" formatiert und angezeigt.
Imports System
Imports System.IO
Imports System.Globalization
Imports Microsoft.VisualBasic
Public Class TextToFile
Private const FILE_NAME As String = "MyDateFile.txt"
Public Shared Sub Main()
If File.Exists(FILE_NAME) Then
Console.WriteLine("{0} already exists!", FILE_NAME)
Return
End If
Dim sw As StreamWriter = File.CreateText(FILE_NAME)
'Creates a DateTime.
Dim dtIn As DateTime = DateTime.Now
Dim InvC As CultureInfo = CultureInfo.InvariantCulture
' Writes the string to the file formatted for InvariantCulture.
sw.WriteLine(dtIn.ToString("d", InvC))
sw.Close()
If Not File.Exists(FILE_NAME) Then
Console.WriteLine("{0} does not exist!", FILE_NAME)
Return
End If
Dim sr As StreamReader = File.OpenText(FILE_NAME)
Dim filedate As String
filedate = sr.Readline()
While Not filedate Is Nothing
Console.WriteLine(ControlChars.Newline + "The date stored in _
the file formatted for the invariant culture is:" + _
ControlChars.Newline + " {0}", filedate )
' Creates a new DateTime and parses the
' string stored in the file.
Dim dtout as DateTime = DateTime.Parse(filedate, InvC)
' Creates a CultureInfo set to "fr-FR".
Dim frc As New CultureInfo("fr-FR")
' Displays the date formatted for the "fr-FR" culture.
Console.WriteLine(ControlChars.Newline + "The date read from _
the file and formatted for the culture ""fr-FR"" is:" + _
ControlChars.Newline + " {0}", dtout.ToString("d", frc))
' Creates a CultureInfo set to "ja-JP".
Dim jpn As New CultureInfo("ja-JP")
' Displays the date formatted for the "ja-JP" culture.
Console.WriteLine(ControlChars.Newline + "The date read from _
the file and formatted for the culture ""ja-JP"" is:" + _
ControlChars.Newline + " {0}", dtout.ToString("d", jpn))
filedate = sr.Readline()
End While
Console.WriteLine(ControlChars.Newline + "The end of the stream _
has been reached.")
sr.Close()
End Sub
End Class
using System;
using System.IO;
using System.Globalization;
public class TextToFile
{
private const string FILE_NAME = "MyDateFile.txt";
public static void Main(String[] args)
{
if (File.Exists(FILE_NAME))
{
Console.WriteLine("{0} already exists!", FILE_NAME);
return;
}
StreamWriter sw = File.CreateText(FILE_NAME);
// Creates a DateTime.
DateTime dtIn = DateTime.Now;
// Creates a CultureInfo set to InvariantCulture.
CultureInfo InvC = new CultureInfo("");
// Converts dt to a string formatted for InvariantCulture,
// and writes it to a file.
sw.WriteLine (dtIn.ToString("d",InvC));
sw.Close();
if (!File.Exists(FILE_NAME))
{
Console.WriteLine("{0} does not exist!", FILE_NAME);
return;
}
StreamReader sr = File.OpenText(FILE_NAME);
String date;
while ((date=sr.ReadLine())!=null)
{
Console.WriteLine("\nThe date stored in the file formatted for
the invariant culture is:\n{0}" , date);
// Parses the string stored in the file,
// and stores it in a DateTime.
DateTime dtout = DateTime.Parse(date, InvC);
// Creates a CultureInfo set to "fr-FR".
CultureInfo frc = new CultureInfo("fr-FR");
// Displays the date formatted for the "fr-FR" culture.
Console.WriteLine("\nThe date read from the file and formatted
for the culture \"fr-FR\" is:\n{0}" , dtout.ToString("d",
frc));
// Creates a CultureInfo set to "ja-JP".
CultureInfo jpn= new CultureInfo("ja-JP");
// Displays the date formatted for the "ja-JP" culture.
Console.WriteLine("\nThe date read from the file and formatted
for the culture \"ja-JP\" is:\n{0}" , dtout.ToString("d",
jpn));
}
Console.WriteLine ("\nThe end of the stream has been reached.");
sr.Close();
}
}
Dieser Code erzeugt die folgende Ausgabe:
The date stored in the file formatted for the invariant culture is:
07/24/2001
The date read from the file and formatted for the culture "fr-FR" is:
24/07/2001
The date read from the file and formatted for the culture "ja-JP" is:
2001/07/24
The end of the stream has been reached.
Siehe auch
Referenz
CultureInfo Class
CultureInfo.CurrentUICulture Property
CultureInfo.CreateSpecificCulture Method