读取文件缺少编码

问题描述

您好,我正在开发一个小应用程序,可以通过imap从未读邮件中下载附件,并对该附件进行sevarla作业。问题是编码,因为在保存了例如txt文件之后,当我再次加载它时,带有重音符号的字母变为“?”我不知道为什么。我在网上尝试了几个示例(例如直接将文件从ansi转换为utf-8),但没有结果。当我在Windows中打开文件可以正常工作时,字词正确。

在以下示例中,我使用了StreamReader的ReadAllText:

 string contents = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "\\uid\\" + summary.UniqueId.ToString() + "\\" + fileName,Encoding.UTF8);
 using (StreamReader reader = new StreamReader(contents,Encoding.UTF8))

如下面的示例所示,如果我直接从文件号中设置带有重音词的字符串,则它可以正常工作。

请帮助我!

check image

可复制代码

using CsvHelper;
using NLog;
using System;
using System.Data;
using System.IO;
using System.Text;

namespace ConsoleApp1
{
class Class1
{
    public static void test2()
    {
        using (var client = new ImapClient())
        {
            try
            {
                int porta = Convert.ToInt32(par.portaimap);
                bool ssl = Convert.ToBoolean(par.sslimap);
                client.Connect(par.host,porta,ssl);
                Logger.Info("Connessione server posta riuscita");
            }
            catch (Exception ex)
            {
                Logger.Error("Connessione non riuscita; di seguito l'errore: " + ex.Message);
            }

            try
            {
                Logger.Info("Autenticazione in corso");
                client.Authenticate(par.usernameimap,par.passwordimap);
            }
            catch (Exception ex)
            {
                Logger.Error("Connessione non riuscita; di seguito l'errore: " + ex.Message);
            }
            // The InBox folder is always available on all IMAP servers...
            var inBox = client.InBox;
            inBox.Open(FolderAccess.ReadWrite);

            Console.WriteLine("Total messages: {0}",inBox.Count);
            Console.WriteLine("Recent messages: {0}",inBox.Recent);

            var query = SearchQuery.NotSeen;//SearchQuery.SubjectContains("MimeKit").Or(SearchQuery.SubjectContains("MailKit"));
            var uids = client.InBox.Search(query);

            var items = client.InBox.Fetch(uids,MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);


            Logger.Info("Selezione lista di email non lette");
            foreach (var summary in items)
            {

                var directory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "\\uid\\",summary.UniqueId.ToString());
                // create the directory
                Directory.CreateDirectory(directory);

                if (summary.Body is BodyPartMultipart)
                    Logger.Info("Download allegati in corso.");
                foreach (var attachment in summary.Attachments)
                {
                    var entity = client.InBox.GetBodyPart(summary.UniqueId,attachment);
                    var part = (MimePart)entity;

                    // note: it's possible for this to be null,but most will specify a filename
                    var fileName = part.FileName;
                    var path = Path.Combine(directory,fileName);
                    try
                    {
                        using (var stream = File.Create(path))
                            part.Content.Decodeto(stream);
                        Logger.Info("Allegato scaricato.");
                    }
                    catch (Exception ex)
                    {
                        Logger.Error("Allegato non scaricato. Di seguito errore: " + ex.Message);
                    }


                    int scelta = 0;



                    string contents = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "\\uid\\" + summary.UniqueId.ToString() + "\\" + fileName,Encoding.UTF8);

                    Console.WriteLine(contents);
                    Console.ReadLine();

                    contents = "Proprietà";
                    Console.WriteLine(contents);
                    Console.ReadLine();

                    string ext = Path.GetExtension(fileName);

                    SmtpSettings smtpSettings = new SmtpSettings();
                    smtpSettings.SenderName = "Test";
                    smtpSettings.server = "smtp.gmail.com";
                    smtpSettings.Port = 587;
                    smtpSettings.SenderMail = par.usernameimap;
                    smtpSettings.Username = par.usernameimap;
                    smtpSettings.Password = par.passwordimap;
                    smtpSettings.ToMail1Name = "Test1";
                    smtpSettings.ToMail1 = "[email protected]";
                    smtpSettings.ToMail2Name = "Test2";
                    smtpSettings.ToMail2 = "[email protected]";
                    string PATHTODELETE = "";
                    if (ext == ".txt")
                    {


                        string line1 = File.ReadLines(AppDomain.CurrentDomain.BaseDirectory + "\\uid\\" + summary.UniqueId.ToString() + "\\" + fileName).First();

                        if (line1 == "FOR|CLIEN|STAB|INSEGNA|INDIRIZZO|CAP|LUOGO|PROV|ORDINE|POS|STATO|DTORD|ORAORD|MALFUNZIONE|COD_RIS|RISORSA|TERMID|ESESIA|STABSIA|ABI|TELEFONO|NOTE|COD_HOST|ACCESSORIO|DESC_HOST|MOD_COLLEG|FUNZ. AGG:|REFERENTE|DT_SCADENZA|LAKA|")
                        {


                            DataTable dt;

                            using (StreamReader reader = new StreamReader(contents,Encoding.UTF8))
                            using (var csv = new CsvReader(reader,CultureInfo.InvariantCulture))
                            {
                                csv.Configuration.Delimiter = "|";
                                // Do any configuration to `CsvReader` before creating CsvDataReader.
                                using (var dr = new CsvDataReader(csv))
                                {
                                    dt = new DataTable();
                                    dt.Load(dr);
                                    reader.Close();
                                }
                            }


                            //Costruzione body mail csv
                            string value = "";
                            string filename = "";
                            string Msg = "";
                            foreach (DaTarow drow in dt.Rows)
                            {
                                value = "";
                                value += "FOR: " + drow["FOR"].ToString() + "\n";
                                value += "CLIEN: " + drow["CLIEN"].ToString() + "\n";
                                value += "STAB: " + drow["STAB"].ToString() + "\n";
                                value += "INSEGNA: " + drow["INSEGNA"].ToString() + "\n";
                                value += "INDIRIZZO: " + drow["INDIRIZZO"].ToString() + "\n";
                                value += "LUOGO: " + drow["LUOGO"].ToString() + "\n";
                                value += "ORDINE: " + drow["ORDINE"].ToString() + "\n";
                                value += "POS: " + drow["POS"].ToString() + "\n";
                                value += "STATO: " + drow["STATO"].ToString() + "\n";
                                value += "DTORD: " + drow["DTORD"].ToString() + "\n";
                                value += "ORAORD: " + drow["ORAORD"].ToString() + "\n";
                                value += "MALFUNZIONE: " + drow["MALFUNZIONE"].ToString() + "\n";
                                value += "COD_RIS: " + drow["COD_RIS"].ToString() + "\n";
                                value += "RISORSA: " + drow["RISORSA"].ToString() + "\n";
                                value += "TERMID: " + drow["TERMID"].ToString() + "\n";
                                value += "ESESIA: " + drow["ESESIA"].ToString() + "\n";
                                value += "STABSIA: " + drow["STABSIA"].ToString() + "\n";
                                value += "ABI: " + drow["ABI"].ToString() + "\n";
                                value += "TELEFONO: " + drow["TELEFONO"].ToString() + "\n";
                                value += "NOTE: " + drow["NOTE"].ToString() + "\n";
                                value += "COD_HOST: " + drow["COD_HOST"].ToString() + "\n";
                                value += "ACCESSORIO: " + drow["ACCESSORIO"].ToString() + "\n";
                                value += "DESC_HOST: " + drow["DESC_HOST"].ToString() + "\n";
                                value += "MOD_COLLEG: " + drow["MOD_COLLEG"].ToString() + "\n";
                                value += "FUNZ. AGG: " + drow["FUNZ. AGG:"].ToString() + "\n";
                                value += "REFERENTE: " + drow["REFERENTE"].ToString() + "\n";
                                value += "DT_SCADENZA: " + drow["DT_SCADENZA"].ToString() + "\n";
                                value += "LAKA: " + drow["LAKA"].ToString();

                                Msg = value;

                                // Save File to .txt
                                filename = AppDomain.CurrentDomain.BaseDirectory + "\\uid\\" + summary.UniqueId.ToString() + "\\" + DateTime.Now.Millisecond.ToString() + ".txt";
                                PATHTODELETE = AppDomain.CurrentDomain.BaseDirectory + "\\uid\\" + summary.UniqueId.ToString() + "\\";
                                using (FileStream fParameter = new FileStream(filename,FileMode.Create,FileAccess.Write))
                                {
                                    StreamWriter m_WriterParameter = new StreamWriter(fParameter);
                                    m_WriterParameter.BaseStream.Seek(0,SeekOrigin.End);
                                    m_WriterParameter.Write(Msg,Encoding.UTF8);
                                    m_WriterParameter.Flush();
                                    m_WriterParameter.Close();
                                }


                                smtpSettings.Subject = "Oggetto Temporaneo da cambiare";


                                Invio(smtpSettings,Msg,filename);
                                try
                                {
                                    inBox.AddFlags(summary.UniqueId,MessageFlags.Seen,true);
                                }
                                catch (Exception ex)
                                {
                                    Logger.Error(ex.Message);
                                }


                            }
                            Logger.Info("Pulizia directory allegati in corso...");
                            DeleteDirectory(PATHTODELETE);
                            Logger.Info("Pulizia directory allegati terminata.");



                        }
                        else
                        {

                            string[] stringSeparators = new string[] { "************************************************************************************************************" };
                            string[] attivita = contents.Split(stringSeparators,StringSplitOptions.None);



                            foreach (string att in attivita)
                            {

                                Console.WriteLine(att);

                                string Msg = att;

                                // Save File to .txt
                                string filename = AppDomain.CurrentDomain.BaseDirectory + "\\uid\\" + summary.UniqueId.ToString() + "\\" + DateTime.Now.Millisecond.ToString() + ".txt";
                                PATHTODELETE = AppDomain.CurrentDomain.BaseDirectory + "\\uid\\" + summary.UniqueId.ToString() + "\\";
                                FileStream fParameter = new FileStream(filename,FileAccess.Write);
                                StreamWriter m_WriterParameter = new StreamWriter(fParameter);
                                m_WriterParameter.BaseStream.Seek(0,SeekOrigin.End);
                                m_WriterParameter.Write(Msg);
                                m_WriterParameter.Flush();
                                m_WriterParameter.Close();

                                smtpSettings.Subject = "Oggetto Temporaneo da cambiare";
                                if (att.Contains("OGGETTO"))
                                {

                                    Invio(smtpSettings,att,filename);

                                }
                                else { }


                            }
                            Logger.Info("Pulizia directory allegati in corso...");
                            DeleteDirectory(PATHTODELETE);
                            try
                            {
                                inBox.AddFlags(summary.UniqueId,true);
                            }
                            catch (Exception ex)
                            {
                                Logger.Error(ex.Message);
                            }
                            Logger.Info("Pulizia directory allegati terminata.");
                        }
                    }
                    else
                    {

                    }

                }


            }

        }
    }
  }
}

在网上搜索后,我找到了解决方案,这里microsoft msdn Streamreader以及readalltext可能不支持带有UTF-8编码的重音字母,因此在UTF-7中对其进行更改后,字母会正确显示

感谢您的支持

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)