Utilisation de la propriété InvariantCulture

La propriété CultureInfo.InvariantCulture n'est ni une culture neutre, ni une culture spécifique. Cette culture d'un troisième type pourrait être qualifiée d'indifférente. En effet, la culture invariante est associée à la langue anglaise, mais non à un pays ou à une région. Vous pouvez utiliser InvariantCulture dans presque toutes les méthodes de l'espace de noms System.Globalization qui requièrent une culture. Toutefois, vous devez utiliser la culture indifférente uniquement pour les processus qui nécessitent des résultats indépendants de la culture, tels que la mise en forme et l'analyse des données qui sont rendues persistantes pour un fichier. Dans les autres cas, elle produit des résultats qui risquent d'être linguistiquement incorrects ou culturellement inadéquats.

Considérations sur la sécurité

Si une décision de sécurité est prise en fonction du résultat d'une comparaison de chaînes ou modification de la casse, utilisez une comparaison ordinale qui ignore le cas au lieu d'utiliser InvariantCulture. Cela vient du fait que les implémentations par défaut des méthodes telles que String.Compare, String.ToUpper et String.ToLower utilisent la propriété CultureInfo.CurrentCulture. Le code qui effectue des opérations de chaînes dépendantes de la culture peut mettre la sécurité en danger si CultureInfo.CurrentCulture est modifié ou si la culture paramétrée sur l'ordinateur sur lequel le code est exécuté est différente de celle qui est utilisée par le développeur pour tester le code. Le comportement attendu par le développeur écrivant une opération de chaînes diffère du comportement du code sur l'ordinateur sur lequel l'opération s'effectue. Par opposition, une comparaison ordinale dépend uniquement de la valeur binaire des caractères comparés.

Opérations de chaîne

Si vous souhaitez exécuter une opération de chaîne dépendante de la culture qui n'est pas affectée par la valeur de CultureInfo.CurrentCulture, utilisez une méthode qui accepte un paramètre CultureInfo, en spécifiant la valeur de la propriété CultureInfo.InvariantCulture pour le paramètre CultureInfo. Utilisez InvariantCulture avec des méthodes telles que String.Compare, String.ToUpper et String.ToLower pour éliminer des variations culturelles et garantir des résultats cohérents. Pour plus d'informations sur l'utilisation de la propriété InvariantCulture pour effectuer des opérations de chaînes indépendantes de la culture, consultez Opérations de chaînes indépendantes de la culture.

Persistance des données

La propriété InvariantCulture s'avère utile pour stocker des données qui ne seront pas affichées directement sur l'ordinateur de l'utilisateur final. Le stockage des données sous une forme indépendante des cultures garantit un format connu, qui ne change pas. Lorsque des utilisateurs de cultures différentes accèdent aux données, celles-ci peuvent être mises en forme de façon appropriée en fonction de l'utilisateur. Par exemple, si vous stockez dans un fichier texte des chaînes de type DateTime mises en forme pour la culture InvariantCulture, utilisez la propriété InvariantCulture lorsque vous appelez la méthode DateTime.ToString pour stocker les chaînes et la méthode Date.Parse pour récupérer les chaînes. Cette approche permet de s'assurer que les valeurs sous-jacentes des types DateTime ne changent pas lorsque les données sont lues ou écrites par des utilisateurs de cultures différentes.

L'exemple de code suivant montre comment initialiser CultureInfo avec la culture dite indifférente à l'aide d'une chaîne vide ("") ou de CultureInfo.InvariantCulture.

' 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;

L'exemple de code suivant montre comment écrire une valeur DateTime dans un fichier sous la forme d'une chaîne mise en forme pour la culture InvariantCulture à l'aide de la méthode DateTime.ToString. La chaîne est ensuite extraite du fichier sous le format InvariantCulture et convertie en une valeur DateTime à l'aide de la méthode Date.Parse. La valeur DateTime est ensuite mise en forme et affichée pour les cultures "fr-FR" et "ja-JP".

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();
   }
}

Ce code génère la sortie suivante :

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.

Voir aussi

Référence

CultureInfo Class
CultureInfo.CurrentUICulture Property
CultureInfo.CreateSpecificCulture Method

Autres ressources

Codage et localisation