.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 ...
随机推荐
- 【JUC】CyclicBarrier和Semaphore的使用
CyclicBarrier的使用 CyclicBarrier:可以让一组检测到一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有的屏障拦截的线程才会继续执行,线程进入屏障通过Cyclic ...
- 【C++】常量
注意:以下内容摘自文献[1],修改了部分内容. 1.常量:常量的值是不能改变的,一般从其字面形式即可判别是否为常量. 2.常量包括数值型常量(即常数)和字符型常量. 3.常量无unsigned型.但一 ...
- GNS3配置问题(持续更新)
GNS3配置问题 1.关于All in One的GNS3提示"判断dynamips版本失败"的解决办法 当我们找到GNS3根目录里的dynamips.exe,执行会报错告诉我们缺少 ...
- 2020年,哪一款远程桌面(VPS管理器)最值得你期待
上周,我得知到,iis7远程桌面版本又更新的消息.进入该网站一看,果然如此. 通道:IIS7远程桌面V2.0.1 版本 最新程序截图如下,和老版本相比,果然又高大上了很多:
- 小谢第2问:后端返回为数组list时候,怎么实现转为tree
要求后端返回给我的list时候,在数组中定义有id , parentid, 可以用双重循环的方法,得到tree需要的数据结构,这样得到的数据就可以直接复制给树组件的data啦const oldData ...
- Rocket - diplomacy - LazyModule
https://mp.weixin.qq.com/s/FBU8fE4u9-UK6mRGQOlvbQ 介绍LazyModule的实现. 1. children LazyModu ...
- 【asp.net core 系列】3 视图以及视图与控制器
0.前言 在之前的几篇中,我们大概介绍了如何创建一个asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元.这一篇我们将介绍一下控制器与视图直接的关系. 1. 视图 这里的 ...
- IntelliJ IDEA连接不上数据库 (Connection to testdb@localhost failed. [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up.)
问题提示为: 原因:MySQL数据库版本为8.0以上,需要在URL加上时区,即加上?serverTimezone=GMT 成功后为:
- JavaSE (四)程序流程控制 -- if 、switch、for、while
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 目录 前置: * . 从键盘读取数据: 1.分支结构 1.1 if-else结构 1.2 switch- ...
- Java实现 蓝桥杯 算法提高 文本加密
算法提高 9-2 文本加密 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A&quo ...