C#檔案上傳編碼亂碼

來源:互聯網
上載者:User

標籤:bom   mic   VID   title   reader   async   mode   returns   判斷   

又遇到檔案編碼亂碼的事情,這回稍微有些頭緒,但是還是花了很多時間去解決。

情境:上傳csv檔案,匯入到資料庫。上傳檔案的編碼不定,需要轉成unicode儲存。

問題點:需要解決判斷上傳檔案的編碼。

關於編碼,網上已有很多部落格解釋,只需查詢關鍵字 unicode ansi bom 等

下面貼一個.net 官方的一些編碼類別型 地址:https://msdn.microsoft.com/zh-cn/library/windows/desktop/dd317756(v=vs.85).aspx

我這邊主要是判斷中文編碼和unicode的一系列編碼。在使用GB2312時發現該編碼方式不存在,需要匯入編碼包:System.Text.Encoding.CodePages

並在使用該編碼前添加一行

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

 

之後即可使用,使用方式如下:

Encoding.GetEncoding("GB2312")

 

根據網上一個高分根據bom判斷編碼方式(GB2312無法根據bom判斷,且我的案例中只需判斷unicode和GB2312,因此修改了方法,default返回GB2312)

 1 /// <summary> 2         /// 擷取檔案編碼方式 3         /// </summary> 4         /// <param name="filename"></param> 5         /// <returns></returns> 6         public static Encoding GetEncoding(string filename) 7         { 8             // Read the BOM 9             var bom = new byte[4];10             using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))11             {12                 file.Read(bom, 0, 4);13             }14 15             // Analyze the BOM16             if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) return Encoding.UTF7;17             if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) return Encoding.UTF8;18             if (bom[0] == 0xff && bom[1] == 0xfe) return Encoding.Unicode; //UTF-16LE19             if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE20             if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) return Encoding.UTF32;21             return Encoding.GetEncoding("GB2312");22         }

 

另外,在上傳的檔案是根據這個編碼方式,讀入檔案流,而.net內部本身就是unicode編碼,可以直接儲存使用。

1  var encoding = GetEncoding(filePath);2  using (var sr = new StreamReader(file.OpenReadStream(), encoding, true)) //此處必須設定為true,用於設定自動察覺bom3  {4      using (var sw = new StreamWriter(filePath))5      {6           await sw.WriteAsync(sr.ReadToEnd()).ConfigureAwait(false);7      }8  }

 

關於這個自動察覺bom,借鑒部落格https://www.mgenware.com/blog/?p=175

C#檔案上傳編碼亂碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.