.Net Core踩坑记:读取txt中文乱码
迁移.net framework的项目,有块读取txt中文转码的问题,普通的不能再普通的代码,想都没想直接copy过去,也没测,结果今天就被坑了。Core是3.1版本,这是原来的代码:
string content = System.IO.File.ReadAllText(fileFullPath, Encoding.Default);
System.IO.File.WriteAllText(fileFullPath, content, Encoding.UTF8);
很基础的功能,网上一搜一大堆。但是Core直接运行读取中文还是乱码,看似一个小问题,百度之,渐渐的发现这是一个小坑坑,于是乎,开始刨根问底。
首先发现两个环境下 Encoding.Default 这个东西是不同的。官方API解释:链接
瞅瞅这是人话吗,为什么Core就始终返回utf8呢?看了一眼.net framework下的 Encoding.Default,是这个东东。

所以换个编码就应该就OK了(当然中文本来就是GB2312),结果现实啪啪打脸,居然报错了(脑补一个笑哭的表情)。
string content1 = System.IO.File.ReadAllText(filePath, Encoding.GetEncoding("GB2312"));

官方API解释:Encoding.RegisterProvider , CodePagesEncodingProvider.Instance,Core下想支持GetEncoding需要先操作一步:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
至此,读取中文正常。
但是,按照标准程序员的思维,这写死肯定不对啊。既然人家不支持了,顺着思路肯定是想办法获取正确的编码然后进行读取。因为txt默认是ANSI编码,所以找了一个.Net Core 读取ansi编码的方法,大家可以参考一下。贴上这位大哥的地址:https://www.cnblogs.com/ives/p/10346498.html。
一番断点测试,发现,其实并没有返回正确的编码格式,只是默认GB2312,那跟写死还是没有区别,于是在茫茫代码中,发现一句:Encoding.GetEncoding(0);
又一番断点测试,发现,在没有注册编码前,Encoding.GetEncoding(0) 等同于 Encoding.Default,但是注册后 Encoding.GetEncoding(0) 等同于 Encoding.GetEncoding("GB2312")。再次仔细阅读API,稍微理解了一下这句话,我理解的意思大概是:这么注册一下再获取默认编码的时候,程序就知道用GB2312了。

总结: 1、.Net Framework 读取txt用 Encoding.Default 默认就是 GB2312。
2、.Net Core必须注册编码方法 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 并且用Encoding.GetEncoding(0) 读取。
3、官方文档解释的还是很到位的,就是感觉看起来有点难理解,也不知道是翻译的问题,还是小弟水平有限。(再脑补一个笑哭的表情)
.Net Core踩坑记:读取txt中文乱码的更多相关文章
- PHP读取TXT中文乱码的解决方法
//$fname文件名称 if ($fname = $_FILES['nickname']['tmp_name']) { //file_get_contents() 函数把整个文件读入一个字符串中. ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark踩坑记:Spark Streaming+kafka应用及调优
前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从k ...
- .NET Core爬坑记 1.0 项目文件
前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以 ...
- EOS踩坑记 2
[EOS踩坑记 2] 1.--contracts-console 在开发模式下,需要将 nodeos 添加此选项. 2.Debug Method The main method used to deb ...
- windows container 踩坑记
windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署 ...
- Hook踩坑记:React Hook react-unity-webgl
自公司前后分离上手React以来,一个坑一个坑的踩,Class的全生命周期云里雾里,还么屡明白,就抱上了Hook的大腿不松手,确实爽到飞起.修改到Hook的过程基本比较顺畅,直接少了三分之一的代码,组 ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- 【踩坑记】从HybridApp到ReactNative
前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...
随机推荐
- springmvc-初次接触
一,mvc做的事情 1,将url映射到java类或者java的方法. 2,封装用户提交的数据 3,处理请求--调用相关的业务处理--封装想相应的数据 4,将相应数据进行渲染,jsp或者html 二,s ...
- Web前端:1、HTML&CSS概述及结构
万维网联盟(World Wide Web Consortium)简称W3C,专门为了定义网页相关的标准而成立,如网页中的HTML.CSS.DOM.HTTP.XML等标准. 根据W3C标准,一个网页主要 ...
- MySQL8多实例安装与mycat连接,最详细版本。
[版权所有,转载请注明出处!违者必究!] 最近在搞mycat去实现主从库读写分离,所以博主就在自己的windows机器上进行了环境的搭建,在搭建MySQL多实例的时候还算顺利,就是mysql8和myc ...
- MongoDB -MSC集群的部署
一.Shard节点配置过程 1. 目录创建:mkdir -p /mongodb/38021/conf /mongodb/38021/log /mongodb/38021/datamkdir -p ...
- Redis详解(九)------ 哨兵(Sentinel)模式详解
在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我 ...
- toString()方法的使用
toString()方法: java.lang.Object类的toString()方法的定义如下: public String toString(){ return getClass().getNa ...
- java方式实现插入排序
一.基本思想 通过构建有序序列,从前往后扫描未排序序列,依此取出未排序序列元素,然后从后往前扫描有序序列,找到相应位置并插入.该算法一个进行n-1趟插入,每一趟插入要进行n-k(k为第k趟插入)次比较 ...
- 记录B端和C端产品的理解
C 为:Consumer.Client,我们每天都在接触C端产品,为消费者.个人用户或终端用户,比如:微信.头条.抖音.美团等等. B 为:Business,作为职场人士也会经常接触B端产品,通常为企 ...
- VNC CentOS 7 远程工具,VNC CentOS 7 远程工具推荐!
IIS7服务器管理工具是一款能够在Windows和Linux系统下进行VNC使用的软件!它能够成为VNC的客户端,帮助操作者完成VNC的相关命令!同时,它还能够作为FTP的操作客户端,实现FTP的传输 ...
- Rocket - tilelink - RegisterRouter
https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA 简单介绍RegisterRouter的实现. 1. 基本介绍 实现挂在Tile ...