La création d'une UTF8 fichier texte au lieu de la norme ANSI
J'ai ce bout de code à écrire un fichier en mode asynchrone:
private static async Task WriteTextAsync(string filePath, string text)
{ //Writes to our output files
byte[] encodedText = Encoding.UTF8.GetBytes(text);
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Create, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true))
{
await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
};
}
Le texte créé de fichier est un format ANSI et malgré le fait d'avoir mis le Encoding.UTF8
. Il y a 15 constructeurs surchargés pour la FileStream
classe, et ce n'est pas du tout évident pour moi où je dois définir ce si pas sur le texte codé.
Je peux dire que le fichier est ANSI, parce que quand je l'ouvre dans TextPad et afficher le fichier des statistiques qu'il a listes ANSI que le Jeu de codes:
D'avoir des problèmes, parce que MySQL LOAD INFILE
n'est pas de la lecture du fichier correctement, après avoir lu les réponses que je crois qu'il a quelque chose à voir avec la NOMENCLATURE, mais pas sûr.
J'ai essayé ce (BOM):
byte[] encodedText = new byte[] { 0xEF, 0xBB, 0xBF }.Concat(Encoding.UTF8.GetBytes(text)).ToArray();
using (FileStream sourceStream = new FileStream(filePath,
FileMode.Create, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true))
{
await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
};
Textpad alors vu comme de l'utf-8, MySQL LOAD INFILE
encore échoué. Réenregistrés dans Textpad, et MySQL vu correctement.
Code modifié:
using (TextWriter writer = File.CreateText(filePath))
{
await writer.WriteAsync(text);
}
Cela semblait fonctionner dans les deux. Je ne suis pas sûr de ce que le problème est avec MySQL LOAD INFILE
à ce sujet.
Mise à jour de réponse.
Re votre edit: textpad ne peut pas dire c'est de l'UTF-8, à moins qu'il y a un MOB, ou les caractères ci-dessus 127. ASCII, ANSI et UTF-8 tous identiques à 100% si tous les personnages sont dans la plage 0-127 (en supposant sans BOM)
OriginalL'auteur user17753 | 2012-10-23
Vous devez vous connecter pour publier un commentaire.
Pas, c'est certainement l'UTF-8:
Qui peut seulement vous donner UTF-8; vous pouvez alors écrire
encodedText
le cours d'eau.Cependant! UTF-8 sera identique à ASCII/ANSI pour tous les caractères dans la plage 0-127. Il ne semble différent au-dessus. Faux positif?
voir mon commentaire sur la question. Si le vrai problème est que MySQL exige une NOMENCLATURE, alors que c'est une préoccupation distincte: cependant, une NOMENCLATURE n'est pas un condition, et il est encore valide d'un fichier UTF-8 sans BOM.
OriginalL'auteur Marc Gravell
Je crois que vous oubliez d'écrire En-tête de NOMENCLATURE au début du fichier. Comme vous êtes à l'aide de FileStream (et pas une sorte de TextWriter) vous devez écrire à la main.
Dans le cas de l'UTF-8, il doit être "EF BB BF"
Une NOMENCLATURE est pas une nécessité absolue, vraiment. C'est bien beau, peut - être, mais elle risque aussi de mauvais clients de l'incompréhension des premiers octets, même si le reste des données est un pur ASCII.
OriginalL'auteur Ondra