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)
/// <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#文件上传编码乱码的更多相关文章
- 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题
response.setContentType("text/html; charset=UTF-8"); Boolean isMultipart = ServletFileUpl ...
- 表单文件上传编码方式(enctype 属性)
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 如下: <form action="upload.php" method="post&quo ...
- Spring MVC—拦截器,文件上传,中文乱码处理,Rest风格,异常处理机制
拦截器 文件上传 -中文乱码解决 rest风格 异常处理机制 拦截器 Spring MVC可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerI ...
- 表单同时有中文字段和文件上传,加上enctype="multipart/form-data"后导致的中文乱码问题
因为一个表单需要同时上传字段和文件,所以加上enctype="multipart/form-data",但是上传后的中文字段变成了乱码. 把enctype="multip ...
- Ubuntu本地文件上传至HDFS文件系统出现的乱码问题及解决方案
1.问题来源及原因 用shell命令上传到HDFS中之后出现中文乱码,在shell命令窗口查看如图: 在eclipse中的文件HDFS查看工具查看如图: 原因:上传至HDFS文件系统的文本文件(这里是 ...
- 巧用 Jersey RESTful WebService框架解决文件上传乱码
一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...
- 中文名文件上传到linux服务器上以后文件名会乱码(openoffice)
1.中文名文件上传后保存在linux服务器上文件名会乱码,但是我们通过SSH直接对服务器上的一个文件进行重命名是可以使用中文的,而且显示出来是正确的,这说明服务器是可以支持中文的. 2.而为什么上传的 ...
- jm解决乱码问题-参数化-数据库操作-文件上传下载
jm解决乱码问题-参数化-数据库操作-文件上传下载 如果JM出果运行结果是乱码(解决中文BODY乱码的问题) 找到JM的安装路径,例如:C:\apache-jmeter-3.1\bin 用UE打开jm ...
- HttpClient多文件上传代码及普通参数中文乱码问题解决
该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...
随机推荐
- [operator]ELK6的安装
找了很久才找到一个博客写得比较全面的,FrankDeng 系统环境:CentOS7 相关软件:node-v10.9.0.tar.gz.kibana-6.4.0-linux-x86_64.tar.gz. ...
- Android canvas bug
安卓4.1.1-4.1.2的webkit在渲染canvas元素时有bug. 具体表现是出现重影,即canvas的clearRect()方法不能彻底清空画布,仍然保留之前某个状态当“背景”. 目前的修复 ...
- PrintWriter类
PrintWriter是一种过滤流,也是一种处理流,即能对字节流和字符流进行处理. 1.查询API后,我们发现,会有八种构造方法.即: PrintWriter(File file) Creates a ...
- HDU 1111 Secret Code (DFS)
题目链接 题意 : 给你复数X的Xr和Xi,B的Br和Bi,让你求一个数列,使得X = a0 + a1B + a2B2 + ...+ anBn,X=Xr+i*Xi,B=Br+Bi*i : 思路 : 首 ...
- activiti监听器
activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业务非常的复杂,通常有如下一些场景: 1.activiti人员动态的分配. 2.当前任务节点完成的时候,指定需要指定下一个节点的处理人( ...
- ZooKeeper-3.4.10分布式安装指南
目录 目录 1 1. 前言 1 2. 约定 1 3. 安装步骤 2 3.1. 配置/etc/hosts 2 3.2. 设置myid 2 3.3. 修改conf/zoo.cfg 2 3.4. 修改/bi ...
- centos 6.5下安装mysql
1.检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除,否则第4步使用yum安装时会报错: 1 # yum list installed | grep mysql 2 mysql-libs ...
- 用Java实现多线程服务器程序
一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...
- Intel Galileo development documentation
Intel Galileo development Documentation Author:Liutianchen 1552227, Department of Computer Science,E ...
- GBK,UTF-8,和ISO8859-1之间的编码与解码
Unicode.UTF-8 和 ISO8859-1到底有什么区别 将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicod ...