Domanda

Sto usando la classe StreamReader in .NET in questo modo:

using( StreamReader reader = new StreamReader( "c:\somefile.html", true ) {
    string filetext = reader.ReadToEnd();
}

Funziona bene quando il file ha una distinta base.Ho avuto problemi con un file senza distinta base..fondamentalmente ho avuto delle parole senza senso.Quando ho specificato Encoding.Unicode ha funzionato correttamente, ad esempio:

using( StreamReader reader = new StreamReader( "c:\somefile.html", Encoding.Unicode, false ) {
    string filetext = reader.ReadToEnd();
}

Quindi, devo inserire il contenuto del file in una stringa.Quindi, come fanno le persone di solito a gestire questa situazione?So che non esiste una soluzione che funzioni al 100% delle volte, ma mi piacerebbe aumentare le mie probabilità..ovviamente esiste un software che tenta di indovinare (ad esempio blocco note, browser, ecc.).Esiste un metodo nel framework .NET che indovinerà per me?Qualcuno ha del codice che vorrebbe condividere?

Ulteriori informazioni:Questo domanda è praticamente uguale al mio, ma sono nel territorio .NET.Quella domanda mi ha portato a un blog che ne elenca vari rilevamento della codifica librerie, ma nessuna è in .NET

Altri suggerimenti

Si dovrebbe leggere questo articolo di Raymond Chen. Egli va in dettaglio su come i programmi possono indovinare ciò che una codifica è (e parte del divertimento che viene da indovinare)

http://blogs.msdn.com/oldnewthing /archive/2004/03/24/95235.aspx

Ho avuto fortuna con Pude , una porta C# di Mozilla Universal Charset Detector.

UTF-8 è stato progettato in modo che sia improbabile che abbia un testo codificato in modo arbitrario 8bit-codifica come latin1 decodificato al corretto unicode usando UTF-8.

Quindi, l'approccio minimo è questo (pseudocodice, non parlo NET):

Prova:    u = some_text.decode ( "UTF-8") tranne UnicodeDecodeError:    u = some_text.decode ( "più-probabile-encoding")

Per una codifica più-probabile-di solito usa per esempio latin1 o CP1252 o qualsiasi altra cosa. Approcci più sofisticati potrebbero cercare e trovare abbinamenti di caratteri specifici della lingua, ma non sono a conoscenza di qualcosa che lo fa come una libreria o qualcosa del genere.

Ho usato questo per fare qualcosa di simile un po 'indietro:

http://www.conceptdevelopment.net/Localization/NCharDet/

Utilizzare IsTextUnicode di Win32.

In senso generale, è un problema difficile.Vedere: http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx.

Una tecnica hacky potrebbe essere quello di prendere un MD5 del testo, quindi decodificare il testo e ri-codificare in varie codifiche, MD5'ing ciascuno. Se uno corrisponde a indovinare è che la codifica.

Questo è ovviamente troppo lento per qualcosa che gestisce un sacco di file, ma per qualcosa di simile a un editor di testo ho potuto vedere che funziona.

Oltre a questo, sarà le mani sporche di porting delle librerie Java da questo post che è venuto dalla domanda Delphi SO, o utilizzando la funzione IE mlang.

Vedere la mia (recente) risposta a questa (per quanto posso dire, equivalente) domanda: Come posso rilevare la codifica / codepage di un file di testo

non tenta di indovinare in una vasta gamma di possibili codifiche "nazionali", come mlang e NCharDet fare, ma piuttosto presuppone di sapere che tipo di file non Unicode è molto probabile incontrare. Per quanto posso dire dalla tua domanda, si dovrebbe affrontare il problema abbastanza affidabile (senza fare affidamento sulla "scatola nera" della mlang).

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