C#文件上传编码乱码

又遇到文件编码乱码的事情,这回稍微有些头绪,但是还是花了很多时间去解决。

场景:上传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

原文地址:https://www.cnblogs.com/sylvialucy/p/9182332.html

时间: 2024-10-08 22:07:26

C#文件上传编码乱码的相关文章

文件上传三:base64编码上传

介绍三种上传方式: 文件上传一:伪刷新上传 文件上传二:FormData上传 文件上传三:base64编码上传 Flash的方式也玩过,不喜欢不拿来说了. 优点: 1.浏览器可以马上展示图像,不需要先上传到服务端,减少服务端的垃圾图像 2.前端可以压缩.处理后上传到服务端,减少传输过程中的等待时间和服务器压力 缺点: 1.生成编码后保存成图片,倘若不做处理,会比原来的图片容量大,具体原因,搜索关键词:Base64编码为什么会使数据量变大 2.图片越大生成的编码越多,编码越多开发者工具中查看它时卡

PHP文件上传并解决中文文件名乱码问题

PHP文件上传并解决中文文件名乱码问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 if(isset($_FILES['file'])){ ? ????$upload='upload/'.$_FILES['file']['name']; ????? ????? ????if(is_uploaded_file($_FILES['file']['tmp_name'])){ ????????//iconv函数解决上传文件中文名乱码的问题,但是不提倡文

java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

//文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp try{ if(port>-1) { ftp.con

文件上传到tomcat服务器 commons-fileupload的详细介绍与使用

三个类:DiskFileUpload.FileItem和FileUploadException.这三个类全部位于org.apache.commons.fileupload包中. 首先需要说明一下form表格的enctpye的属性: 表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码.默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传:只有使用了multipart/form-data,

java web 文件上传下载

文件上传下载案例: 首先是此案例工程的目录结构: 处理上传: FileUploadServlet.java 1 package fnz.fileUploadTest; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.PrintWriter; 7 import java.text.SimpleDateFormat; 8 import java.

***使用PHP实现文件上传和多文件上传

http://www.365mini.com/page/php-upload-file.htm 在PHP程序开发中,文件上传是一个使用非常普遍的功能,也是PHP程序员的必备技能之一.值得高兴的是,在PHP中实现文件上传功能要比在Java.C#等语言中简单得多.下面我们结合具体的代码实例来详细介绍如何通过PHP实现文件上传和多文件上传功能. 要使用PHP实现文件上传功能,我们先来编写两个php文件:index.php和upload.php.其中,index.php页面用于提交文件上传的表单请求,u

jsp文件上传

整理了一下jsp的上传下载,由客户端到服务端,包括一些常规的业务 一客户端 先看最基本的情况 1 在表单设置multipart/form-data,通过提交键把数据和附件一次性提交的.服务器更多的是对应这个例子. 但有以下问题 一般的Ajax无法把附件数据发过去 附件往往涉及比较多问题,比如上传需要时间(要有个进度),上传也有可能不成功等,上传需要校验的东西就比较多. 2于是就有把上传分开来自己执行的.上传项在浏览文件后就开始上传,其他表单数据在提交表单时再提交. 更详细地说是:上传在表单中有自

Javaweb学习笔记10—文件上传与下载

 今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多 一*, 文件的上传:      1 *分析实现步骤: 1.1* 客户端浏览器通过文件域选择本地要上传的文件. * 点击"上传"按钮

每天学习一个小功能:java文件上传

====(1.)第一种.利用普通缓冲流进行文件上传 ① 前端 注意: 1.指定表单类型为文件上传表单 :enctype="multipart/form-data"  2.提交方式必须为:post3.表单中,存在文件域 的表单元素 <form name="frm_test" action="${pageContext.request.contextPath }/shangchuan" method="post" encty