144 messaggi dal 26 febbraio 2007
Ciao,

Devo leggere un file CSV che viene caricato tramite form.

Ho notato che se viene inviato un file encodato in ANSI e contenenti caratteri accentati (o altri caratteri particolari), non vengono letti correttamente dal mio stream.

per la lettura utilizzo:

using (StreamReader reader = new StreamReader(File.OpenRead(filePath)))



Non potendo impedire il caricamento di file encodati in ANSI, c'è un modo per riconoscerlo e normalizzarlo?

Ad esempio, aprendo questo file con notepad++ e facendo converto to UTF, il file viene poi caricato e letto correttamente.


Come posso gestire questa cosa da codice?


Grazie
333 messaggi dal 05 novembre 2012
Ciao,

prova a dare un occhio qui, non l'ho provato personalmente ma dato l'autore mi fido.

Al posto di convertirlo, identifichi prima l'encoding e di conseguenza poi lo leggi con quello corretto.

/Ciao

Alessio
144 messaggi dal 26 febbraio 2007
Purtroppo non funziona, perchè il file non viene riconosciuto in nessun case, quindi passa il default (che dovrebbe essere NASI), invece il default adesso è UTF.

Sto cercando in giro

Encoding.GetEncoding(1252) //e da eccezione perchè il codice non esiste

System.Text.Encoding.ANSI //non esiste


QUindi non riesco ad associare la codifica ANSi al mio stream

EDIT:

Ho risolto questo problema installando il pacchetto CodePagesEncodingProvider

Encoding enc = CodePagesEncodingProvider.Instance.GetEncoding(1252);


Adesso l'ansi lo legge correttamente, il problema è che con il metodo della guida non mi riconosce i file UTF8 e quindi vengono trattati come ANSI.

Mentre quelli UTF-BOM l'ha identificato e letto correttamente.
Modificato da Federico.C il 18 marzo 2019 09:06 -
333 messaggi dal 05 novembre 2012
Ciao,

il link che ti ho segnalato era per .net framework su .net core il comportamento è differente :(

per capire le problematiche che stai riscontrando prova a dare una letta a questa pagina

L'articolo non risolve il tuo problema attuale perchè alla fine dice di salvare i file in UTF-8 ma la trovo una lettura interessante da fare, utile a capire cosa si sta facendo e non procedere per tentativi

A questo punto, non mi viene in mente una soluzione rapida per il tuo problema, appena ho un attimo provo a dare un occhio

Nell'attesa magari qualche utente che ha riscontrato la stessa difficoltà può riportare la sua esperienza

Buon lavoro
/Ciao

Alessio
333 messaggi dal 05 novembre 2012
Ciao,

soluzione rapida

private static void Main(string[] args)
{
    Encoding enc1252 = CodePagesEncodingProvider.Instance.GetEncoding(1252);

    using (var stream = new StreamReader(@"C:\Users\SBUNNATO\Desktop\ansi.txt", enc1252, true))
    {
        Console.WriteLine(stream.ReadToEnd());
    }

    Console.ReadLine();
}


Guarda la documentazione qui, in particolare detectEncodingFromByteOrderMarks


detectEncodingFromByteOrderMarks: Indicates whether to look for byte order marks at the beginning of the file.


Impostando a true tale parametro, prima viene verificata la presenza della bom all'inizio del file, se presente utilizza la codifica del file altrimenti utilizza quella che hai passato come parametro encoding, in questo caso 1252

Se hai letto il link che ti ho segnalato prima hai chiarito il diverso comportamento tra .net framework e .net core ed il perchè non va bene Encoding.Default ed occorre utilizzare il package da nuget

Ultimo...nel codice che ti ho riportato ho inizializzato lo stream reader con new StreamReader("...", enc1252, true) perchè mi tornava utile per la spiegazione ma in realtà equivale a new StreamReader("...", enc1252)...internamente viene passato true

/Ciao

Alessio
11.886 messaggi dal 09 febbraio 2002
Contributi
Provate ad usare un pacchetto NuGet per capire se riesce a rilevare correttamente l'encoding del file.
https://www.nuget.org/packages/UDE.CSharp/

var detector = new CharsetDetector();
using (var fileStream = File.OpenRead(@"C:\miofile.txt")) {
  detector.Feed(fileStream);
  detector.DataEnd();
  Console.WriteLine($"Detected {detector.Charset} with a confidence of {detector.Confidence}") //Detected UTF-8 with a confidence of 0,505;
}


ciao,
Moreno
Modificato da BrightSoul il 18 marzo 2019 14:16 -

Enjoy learning and just keep making
144 messaggi dal 26 febbraio 2007
grazie mille, aggiungendo quel pacchetto sono riuscito a risolvere.

Ecco il codice che ho utilizzato


public Encoding GetFileEncoding(string srcFile)
        {
            var detector = new CharsetDetector();
            using (var fileStream = File.OpenRead(srcFile))
            {
                detector.Feed(fileStream);
                detector.DataEnd();
            }
            
            switch (detector.Charset.ToUpperInvariant())
            {
                case "UTF-8":
                    return Encoding.UTF8;
                case "UTF-32":
                    return Encoding.UTF32;
                case "UTF-7":
                    return Encoding.UTF7;
                case "WINDOWS-1251":
                    return CodePagesEncodingProvider.Instance.GetEncoding(1251);
                case "WINDOWS-1252":
                    return CodePagesEncodingProvider.Instance.GetEncoding(1252);
                case "WINDOWS-1253":
                    return CodePagesEncodingProvider.Instance.GetEncoding(1253);
                case "WINDOWS-1255":
                    return CodePagesEncodingProvider.Instance.GetEncoding(1255);
                case "ASCII":
                    return Encoding.ASCII;
                default:
                    return Encoding.Default;
            }
        }


Modificato da Federico.C il 18 marzo 2019 15:20 -
144 messaggi dal 26 febbraio 2007
Piccola cosa che ho notato:

Package 'UDE.CSharp 1.1.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.2'. This package may not be fully compatible with your project.

Ho questo avviso nel project, però funziona correttamente

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.