Domanda

Ho un problema con la conversione di un file di testo da ANSI a UTF8 in C #. Cerco di visualizzare i risultati in un browser.

Così ho un file di questo testo con molti caratteri accentati in esso. La sua codificati in ANSI, quindi devo convertirlo in utf8 perché nel browser invece dei accentchars che appaiono "?". Non importa quanto ho cercato di convertire in UTF-8 era ancora un "?". Ma se posso convertire il file di testo nel blocco note ++ per utf8 allora i caratteri di accento sono buone desplayed.

qui è una pace di codice di codifica che ho fatto:

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

Avete qualche idea del perché sta succedendo questo?

È stato utile?

Soluzione

  

Avete qualche idea del perché sta succedendo questo?

Sì, sei troppo tardi. È necessario specificare ANSI quando si legge la stringa da file. In memoria è sempre Unicode (UTF16).

Altri suggerimenti

Quando si converte in ASCII si perde immediatamente tutti i caratteri non inglesi (tra cui quelli con accento) perché ASCII ha solo 127 (7 bit) di caratteri.

Lo fai strano manipolazione. string in .net è in UTF-16, quindi una volta si torna string, non byte[] questo non ha importanza.

Credo che si dovrebbe fare: (immagino da ANSI intendi Latin1)

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

Dato che la questione non era molto chiaro che v'è una considerazione ragionevole che si potrebbe effettivamente bisogno di questo:

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

Questo è probabilmente il modo più semplice:

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

mi sento di raccomandare di leggere questo http://www.joelonsoftware.com/articles/Unicode .html .
Se avete intenzione di leggere un file ASCII è necessario conoscere la pagina di codice del file.

Questa è probabilmente accade perché il vostro string text originale contiene già caratteri non validi. Codifica di conversione ha senso solo se l'input è un array di byte. Quindi, si dovrebbe leggere il file come array di byte invece di stringa, o, come ha detto Henk, specificare la codifica per la lettura del file.

I miei pensieri qui è quando si salva il file in Notepad ++ inserisce il Byte-Order-Mark in modo che il browser può dedurre che si tratta di UTF8 da questo. In caso contrario, si sarebbe probabilmente necessario indicare esplicitamente al browser la codifica dei caratteri, come nella DTD, in XML ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top