Question

J'ai un problème avec la conversion d'un fichier texte à partir ANSI à UTF8 en c #. J'essaie d'afficher les résultats dans un navigateur.

J'ai un fichier ce texte avec beaucoup de caractère d'accent en elle. Son codé en ANSI, donc je dois le convertir en UTF8 parce que dans le navigateur au lieu des accentchars apparaissant « ? ». Peu importe comment j'ai essayé de convertir en UTF8 il était encore un « ? ». Mais si je convertir le fichier texte dans le bloc-notes ++ UTF8 alors les caractères accentués sont bons desplayed.

ici est une paix code encodant que je fait:

    public string Encode(string text)
    {
        // encode the string as an ASCII byte array
        byte[] myASCIIBytes = ASCIIEncoding.ASCII.GetBytes(text);

        // convert the ASCII byte array to a UTF-8 byte array
        byte[] myUTF8Bytes = ASCIIEncoding.Convert(ASCIIEncoding.ASCII, UTF8Encoding.UTF8, myASCIIBytes);

        // reconstitute a string from the UTF-8 byte array 
        return UTF8Encoding.UTF8.GetString(myUTF8Bytes);
    }

Avez-vous une idée de pourquoi est-ce qui se passe?

Était-ce utile?

La solution

  

Avez-vous une idée de pourquoi est-ce qui se passe?

Oui, vous êtes trop tard. Vous devez spécifier ANSI lorsque vous lisez la chaîne à partir du fichier. Dans la mémoire, il est toujours Unicode (UTF16).

Autres conseils

Lorsque vous convertissez en ASCII vous perdez immédiatement tous les caractères non-anglais (y compris ceux avec accent) car ASCII ne dispose que de 127 (7 bits) de caractères.

Vous faites la manipulation étrange. string en .net est en UTF-16, donc une fois que vous revenez string, pas byte[] cela n'a pas d'importance.

Je pense que vous devriez faire: (Je suppose que ANSI-vous dire Latin1)

public byte[] Encode(string text)
{
    return Encoding.GetEncoding(1252).GetBytes(text);
}

Étant donné que la question n'a pas été très clair qu'il ya une remarque raisonnable que vous pouvez avoir besoin celui-ci:

public string Decode(byte[] data)
{
    return Encoding.GetEncoding(1252).GetString(data);
}

Ceci est probablement la meilleure façon:

byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt");
var utf8String = Encoding.Default.GetString(ansiBytes);
File.WriteAllText("outputfilename.txt", utf8String);

Je recommande de lire ce http://www.joelonsoftware.com/articles/Unicode .html .
Si vous allez lire un fichier ASCII que vous devez savoir la page de code du fichier.

Cela se produit probablement parce que votre string text original contient déjà des caractères non valides. conversion d'encodage n'a de sens que si votre entrée est un tableau d'octets. Donc, vous devriez lire le fichier en tant que tableau d'octets au lieu de chaîne, ou, comme l'a dit Henk, spécifiez le codage pour la lecture du fichier.

Je pense ici est lorsque vous enregistrez le fichier dans Notepad ++ insère Byte-Order-Mark de sorte que le navigateur peut en déduire que UTF8 est tout de cela. Sinon, vous auriez probablement dire explicitement le navigateur le codage des caractères, comme dans la DTD, XML, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top