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

Weitere Ressourcen

Codierung und Lokalisierung