.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 ...
随机推荐
- UIAutomator2的API文档(一)
检查并维持设备端守护进程处于运行状态,应该是重启了atx守护进程:d.healthcheck() 1.隐式等待 import uiautomator2 as u2serialno = '7f3dec6 ...
- [ES6系列-02]Arrow Function:Whats this?(箭头函数及它的this及其它)
[原创] 码路工人 大家好,这里是码路工人有力量,我是码路工人,你们是力量. 如果没用过CSharp的lambda 表达式,也没有了解过ES6,那第一眼看到这样代码什么感觉? /* eg.0 * fu ...
- Life In Changsha College- SQA计划与验收测试规程
本次任务 以前面小组完成的SCRUM设计任务作为背景,拟制软件开发任务的虚拟SQA计划. 编制前面小组完成的SCRUM设计任务的验收测试规程. SQA计划 验收测试规程 测试分析:工程完成的功能包括登 ...
- [工具-004]如何从apk中提取AndroidManifest.xml并提取相应信息
跟上一篇类似,我们也需要对APK的一些诸如umengkey,ADkey,TalkingData进行验证,那么我们同样需要解压apk文件,然后提取其中的AndroidManifest.xml.然后解析x ...
- Spring Cloud 学习笔记一
一.spring cloud 搭建注册中心(Eureka server) 1.spring cloud中提供了多种分步式服务组件,其都依赖于注册中心(eureka),注册中心的服务者与发现者都通过Eu ...
- jchdl - RTL实例 - And2And(结构体嵌套的使用)
https://mp.weixin.qq.com/s/PQIPkDymvcGc_re8ux50vA 结构体可以嵌套使用. 参考链接 https://github.com/wjcdx/jchdl ...
- CVE-2020-0796永恒之黑复现POC EXP以及修复方案
描述: 北京时间3月12日,针对最新披露的SMB远程代码执行漏洞(CVE-2020-0796),微软官方发布了针对Windows 10/Server禁用SMBv3(SMB 3.1.1版本)协议压缩的安 ...
- 面试官:兄弟,说说Java的static关键字吧
读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...
- Java实现 LeetCode 587 安装栅栏(图算法转换成数学问题)
587. 安装栅栏 在一个二维的花园中,有一些用 (x, y) 坐标表示的树.由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树.只有当所有的树都被绳子包围时,花园才能围好栅栏.你需要找到正好 ...
- Java实现第十届蓝桥杯等差数列
试题 I: 等差数列 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 [问题描述] 数学老师给小明出了一道等差数列求和的题目.但是粗心的小明忘记了一 部分的数列,只记得其中 N ...