Introduction
Ce billet est dédié à une situation que j’ai eu à personnellement prendre d’assaut dernièrement. Cette situation est très spécifique au domaine d’affaires d’un client que je supporte.
L’idée est que le site accepte des inscriptions par un formulaire. Ces inscriptions sont ensuite enregistrées dans une base de données pour être ensuite exportées dans un fichier CSV. Une fois dans ce fichier, ces inscriptions seront importées dans une liste de contact pour un envoi d’infolettre.
Vous me suivez jusque là? Super.

Parfois, ce client aime bien manipuler la liste d’inscription, dans le format CSV, avant de faire l’importation dans son courrielleur. La méthode commune est d’ouvrir le fichier directement avec Microsoft Excel. Ce dernier va reconnaître le fichier comme une feuille de données et vous pourrez la manipuler de façon transparente, comme un fichier Excel.
Or, il s’avère que Microsoft Excel a de la difficulté à détecter l’encodage d’un fichier UTF-8 l’élément nommé le Byte Order Mark (BOM). Cela veut dire que vos fichiers CSV auront toujours l’air du fichier texte de la prise d’écran ci-haut, à moins que vous interveniez.
Traditionnellement, avec les fichiers UTF-8, le BOM est utilisé pour détecter la validité de l’encodage de ces fichiers. Pour déterminer si un fichier est réellement UTF-8, un éditeur texte tentera de valider la présence de ces octets au tout début du fichier.
Bref, si vous le faites, vous mettez les chances de votre côté.
Comment faire?
AVERTISSEMENT
La solution à appliquer peut varier énormément selon le contexte où vous vous trouvez. Dans mon cas, j’ai eu à utiliser une technique assez bas niveau. Le côté positif de cette technique est qu’elle peut être utilisée dans presque tous les contextes.
Le code que vous allez voir est l’idée générale derrière la véritable solution que j’ai employée pour générer le fichier CSV de mon client. Vous allez comprendre lorsque vous allez le lire.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using (var fs = new FileStream(@"c:\frenchcoding\frenchencoding.csv", FileMode.OpenOrCreate, FileAccess.ReadWrite)) | |
{ | |
var preamble = new UTF8Encoding(true).GetPreamble(); | |
fs.Write(preamble,0,preamble.Count()); | |
var byteArrayLine1 = System.Text.Encoding.UTF8.GetBytes("courriel, nom, prénom"+Environment.NewLine); | |
fs.Write(byteArrayLine1, 0, byteArrayLine1.Count()); | |
var byteArrayLine2 = System.Text.Encoding.UTF8.GetBytes("pascal.paradis@gmail.com, Paradis, Pascal"); | |
fs.Write(byteArrayLine2, 0, byteArrayLine2.Count()); | |
} |
La technique utilisée fait en sorte que le BOM est ajouté immédiatement dans les premiers octets du fichier texte généré. Le BOM est la valeur retournée par la méthode GetPreamble() de la classe UTF8Encoding lorsque la valeur true est envoyée au constructeur.
D’ailleurs, à titre informatif, le nom du paramètre du constructeur est encoderShouldEmitUTF8Identifier. Le nom est assez évocateur. Dans ce cas-ci, vous désirez un fichier UTF-8 alors vous laissez cette valeur à true.
De plus, la preuve ultime que cette solution fonctionne se prouve avec notepad++. L’éditeur texte détecte le fichier comme ayant un encodage UTF-8 pur!