迁移.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中文乱码的更多相关文章

  1. PHP读取TXT中文乱码的解决方法

    //$fname文件名称 if ($fname = $_FILES['nickname']['tmp_name']) { //file_get_contents() 函数把整个文件读入一个字符串中. ...

  2. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  3. Spark踩坑记:Spark Streaming+kafka应用及调优

    前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从k ...

  4. .NET Core爬坑记 1.0 项目文件

    前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以 ...

  5. EOS踩坑记 2

    [EOS踩坑记 2] 1.--contracts-console 在开发模式下,需要将 nodeos 添加此选项. 2.Debug Method The main method used to deb ...

  6. windows container 踩坑记

    windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署 ...

  7. Hook踩坑记:React Hook react-unity-webgl

    自公司前后分离上手React以来,一个坑一个坑的踩,Class的全生命周期云里雾里,还么屡明白,就抱上了Hook的大腿不松手,确实爽到飞起.修改到Hook的过程基本比较顺畅,直接少了三分之一的代码,组 ...

  8. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  9. 【踩坑记】从HybridApp到ReactNative

    前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...

随机推荐

  1. Git-Jenkins-代码的上线

    第一章:自动化上线代码基本介绍 1.软件开发生命周期 老板的创意---产品经理---立项---开发团队---测试团队---运维上线 产品经理---加需求---开发团队---测试----更新代码,上线 ...

  2. P2812 校园网络

    luogu 传送门 首先考虑问题一 不难想到,如果有一个学校作为终端机,那么跟其处于同一个强联通中的所有学校就可以不用作为终端机了. 那么,问题一也就迎刃而解了:找到所有入度为0的缩点.因为这个学校( ...

  3. [SD心灵鸡汤]007.每月一则 - 2015.11

    1.不要因为世界太过复杂,而背叛了你的单纯. 2.人的一生要疯狂一次,无论是为一个人,一段情,一段路途或一个梦想. 3.时间真的很神奇,你永远不知道它会如何改变你.换句话说:以前难吃的蔬菜.苦涩的啤酒 ...

  4. NetCore项目实战篇08---Docker挂载mysql并连接.netCoreWeb

    我们的项目之前在直接连接的mysql,今天我们将通过docker挂载mysql 并与我们开发的webapi项目连接. 1. 安装docker 下载地址: https://download.docker ...

  5. TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?

    前言 网上许多博客针对增大 TCP 半连接队列和全连接队列的方式如下: 增大 TCP 半连接队列的方式是增大 /proc/sys/net/ipv4/tcp_max_syn_backlog: 增大 TC ...

  6. AVIRIS 简介

    AVIRIS 是指 机载可见光近红外成像光谱(Airborne Visible InfraRed Imaging Spectrometer).是由美国NASA下属的喷气动力实验室(JPL)开发和维护的 ...

  7. Matlab矩阵学习一 矩阵的创建

    Matlab矩阵创建 1.直接输入数值创建       矩阵元素要用[ ] 括起来,";"代表一行结束,以下创建方式也是合法的,矩阵的元素可以是实数,也可以是复数,复数用a+bi表 ...

  8. 安装和换源pip

    pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能 一.ubuntu安装和配置pip 1.进入终端,输入命令sudo su root ,输入密码后进入r ...

  9. 如何在Spring Boot应用启动之后立刻执行一段逻辑

    1. 前言 不知道你有没有接到这种需求,项目启动后立马执行一些逻辑.比如简单的缓存预热,或者上线后的广播之类等等.如果你使用 Spring Boot 框架的话就可以借助其提供的接口CommandLin ...

  10. 非阻塞赋值(Non-blocking Assignment)是个伪需求

    https://mp.weixin.qq.com/s/mH84421WDGRb7cuU5FEFIQ Verilog的赋值很是复杂,包括: 1. Continuous assignment; 2. Pr ...