2010-12-04 46 views
9

J'ai un texte lu à partir d'un fichier XML stocké en codage UTF8. C# le lit parfaitement, j'ai vérifié avec le débogueur, mais quand j'essaye de le convertir en ASCII pour l'enregistrer dans un autre fichier je reçois un? char dans des endroits où il y avait un caractère conflictuel. Par exemple, ce texte:Conversion de UTF8 en ASCII

string s = "La introducción masiva de las nuevas tecnologías de la información"; 

sera enregistré comme

"La introducci?n masiva de las nuevas tecnolog?as de la informaci?n" 

Je ne peux pas les remplacer pour leur latin (a, e, i, o, u) voyelles parce que quelques mots en espagnol serait manque le sens. J'ai déjà essayé this et this questions sans succès. Donc j'espère que quelqu'un peut m'aider. La réponse sélectionnée dans le second n'a même pas été compilée ...!

Dans le cas où quelqu'un veut jeter un oeil, mon code est celui-ci:

private void WriteInput(string input) 
{ 
    byte[] byteArray = Encoding.UTF8.GetBytes(input); 
    byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray); 
    string finalString = Encoding.ASCII.GetString(asciiArray); 

    string inputFile = _idFile + ".in"; 
    var batchWriter = new StreamWriter(inputFile, false, Encoding.ASCII); 
    batchWriter.Write(finalString); 
    batchWriter.Close(); 
} 

Répondre

25

Ces caractères n'ont pas de correspondance en ASCII. Passez en revue une table ASCII, comme Wikipedia's, pour vérifier cela. Vous pourriez être intéressé par l'encodage de Windows 1252, ou "extended ASCII", comme on l'appelle parfois, qui a des points de code pour de nombreux caractères accentués, en espagnol inclus.

var input = "La introducción masiva de las nuevas tecnologías de la información"; 
var utf8bytes = Encoding.UTF8.GetBytes(input); 
var win1252Bytes = Encoding.Convert(
       Encoding.UTF8, Encoding.GetEncoding("windows-1252"), utf8bytes); 
File.WriteAllBytes(@"foo.txt", win1252Bytes); 
+0

Essayé avec celui-ci, mais change ó pour o, á pour a. etc ... –

+0

@David: fonctionne parfaitement pour moi, en utilisant le cas de test ci-dessus. Assurez-vous que vous n'avez pas un encodage ASCII (Encoding.ASCII) coincé dans votre code quelque part. –

+0

Désolé, pas ailleurs! testé à nouveau et fonctionne comme un charme ... Maintenant, je sais pourquoi vous avez 18.3K rep !!! ;) –

7

Ne peut pas être fait. ASCII n'a pas ces lettres, donc le mieux que vous pouvez faire est de coder les URL ou unicode-escape-les encoder.

+0

Comment ça marche? Si ASCII n'a pas ces lettres comment puis-je changer l'encodage de UTF8 en ASCII en utilisant Notepad ++ et fonctionne comme un charme? –

+5

Parce que Notepad ++ n'utilise pas vraiment ASCII. Il utilise quelque chose comme CP1250, qui * possède * ces lettres. –

+0

Très bien, vous m'avez là ... –