1. 程式人生 > >C#文件上傳編碼亂碼

C#文件上傳編碼亂碼

獲取 default == 數據庫 sta 方法 OS enc conf

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

場景:上傳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 BOM 16 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-16LE 19 if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE 20 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,用於設置自動察覺bom
3  {
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#文件上傳編碼亂碼