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

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

 /// <summary>
/// 获取文件编码方式
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public static Encoding GetEncoding(string filename)
{
// Read the BOM
var bom = new byte[];
using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
file.Read(bom, , );
} // Analyze the BOM
if (bom[] == 0x2b && bom[] == 0x2f && bom[] == 0x76) return Encoding.UTF7;
if (bom[] == 0xef && bom[] == 0xbb && bom[] == 0xbf) return Encoding.UTF8;
if (bom[] == 0xff && bom[] == 0xfe) return Encoding.Unicode; //UTF-16LE
if (bom[] == 0xfe && bom[] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE
if (bom[] == && bom[] == && bom[] == 0xfe && bom[] == 0xff) return Encoding.UTF32;
return Encoding.GetEncoding("GB2312");
}

另外,在上传的文件是根据这个编码方式,读入文件流,而.net内部本身就是unicode编码,可以直接存储使用。

  var encoding = GetEncoding(filePath);
using (var sr = new StreamReader(file.OpenReadStream(), encoding, true)) //此处必须设置为true,用于设置自动察觉bom
{
using (var sw = new StreamWriter(filePath))
{
await sw.WriteAsync(sr.ReadToEnd()).ConfigureAwait(false);
}
8 }

关于这个自动察觉bom,借鉴博客https://www.mgenware.com/blog/?p=175

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

  1. 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题

    response.setContentType("text/html; charset=UTF-8");  Boolean isMultipart = ServletFileUpl ...

  2. 表单文件上传编码方式(enctype 属性)

    enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 如下: <form action="upload.php" method="post&quo ...

  3. Spring MVC—拦截器,文件上传,中文乱码处理,Rest风格,异常处理机制

    拦截器 文件上传 -中文乱码解决 rest风格 异常处理机制 拦截器 Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerI ...

  4. 表单同时有中文字段和文件上传,加上enctype="multipart/form-data"后导致的中文乱码问题

    因为一个表单需要同时上传字段和文件,所以加上enctype="multipart/form-data",但是上传后的中文字段变成了乱码. 把enctype="multip ...

  5. Ubuntu本地文件上传至HDFS文件系统出现的乱码问题及解决方案

    1.问题来源及原因 用shell命令上传到HDFS中之后出现中文乱码,在shell命令窗口查看如图: 在eclipse中的文件HDFS查看工具查看如图: 原因:上传至HDFS文件系统的文本文件(这里是 ...

  6. 巧用 Jersey RESTful WebService框架解决文件上传乱码

    一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...

  7. 中文名文件上传到linux服务器上以后文件名会乱码(openoffice)

    1.中文名文件上传后保存在linux服务器上文件名会乱码,但是我们通过SSH直接对服务器上的一个文件进行重命名是可以使用中文的,而且显示出来是正确的,这说明服务器是可以支持中文的. 2.而为什么上传的 ...

  8. jm解决乱码问题-参数化-数据库操作-文件上传下载

    jm解决乱码问题-参数化-数据库操作-文件上传下载 如果JM出果运行结果是乱码(解决中文BODY乱码的问题) 找到JM的安装路径,例如:C:\apache-jmeter-3.1\bin 用UE打开jm ...

  9. HttpClient多文件上传代码及普通参数中文乱码问题解决

    该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...

随机推荐

  1. Qt5.3.1,的linux平台体验之旅

    1. samba安装:http://blog.csdn.net/voice_shen/article/details/7692605 2. 安装run,  sudo chmod 777 filenam ...

  2. yii\bootstrap

    yii\bootstrap\ButtonDropdown <?php echo yii\bootstrap\ButtonDropdown::widget([ 'label' => 'Act ...

  3. myeclipse设置默认的jsp打开方式

  4. CentOS系统中Tomcat安装配置

    Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发而 ...

  5. VC中CDC与HDC的区别以及二者之间的转换

    CDC是MFC的DC的一个类 HDC是DC的句柄,API中的一个类似指针的数据类型. MFC类的前缀都是C开头的 H开头的大多数是句柄 这是为了助记,是编程读\写代码的好的习惯. CDC中所有MFC的 ...

  6. Apache Shiro去掉URL中的JSESSIONID

    如果你的shiro版本在1.3.2版本以上这个BUG已经解决只需要在配置文件如下配置中添加红色部分 <!-- 会话管理器 --> <bean id="sessionMana ...

  7. mysql数据库使用sql查询数据库大小及表大小

    网上查了很多资料,最后发现一个可行的,分享如下: 数据库大小查询: select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from inform ...

  8. C# 等待框

    今天发现dev控件自带了等待框,调用方便,而且不会阻塞主线程. 拉一个窗体,界面上放两个按钮,显示等待框,隐藏. <Window x:Class="WaitDialogTest.Mai ...

  9. 异步编程async/await

    什么是异步? 在异步程序中,程序代码不需要按照编写时的顺序严格执行,有时需要一在一个新的线程中运行一部分代码,有时无需创建新的 线程,但是为了更好的利用单个线程的能力,需要改变代码的执行顺序. 进程 ...

  10. VSM Import Cluster功能验证二(导入篇)

    三 vsm import cluster 3.1登录vsm web UI 登陆 VSM web UI,https://172.16.34.51/dashboard/vsm/,点击Cluster Man ...