Conversione problema ANSI a UTF8 C #
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?
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.