读取乱码文件

wzyxs 2021-04-19 07:56:37
问题是这样的:
一个gb2312编码的文本文件,每对双引号包含一个字符串值,在内容有乱码的情况下怎么正确识别双引号位置?
我开始是这么读的:
File.ReadAllLines(filePath, Encoding.GetEncoding(encoding));
出现意外的是下面这种情况:
比如前10个字节都能在ascii字符集或gb字符集里找到对应字符,其中第一个字节是前双引号,到这里一切正常,而第11个字节并非ascii字符、也不是gb字符的第一字节,这时由于gb2312编码每字符占两字节,ReadAllLines函数会把第11和12字节当作一个字符处理,返回一个'?'字符,如果第12字符恰好是后双引号,这个双引号就会被吞掉,请问有什么文件读取方式可以避免这种情况吗?(不想以byte去读文件一字节一字节的去识别.....
我觉得会有解决办法的原因,是因为用vs code以gb2312打开这个文件的话,只有第11字符会变'?',第12字符的双引号会被保留,所以想跟大家取个经,怎么才能达到vs code的效果
...全文
395 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2021-04-25
  • 打赏
  • 举报
回复
既然您不可能提供原始数据,那么就只能求助于上帝l了 还好刚才上帝传话说:乱码是不能通过改变字符集改正过来的,他请你读取前30 个字节的内容并贴出来 用 BitConverter.ToString(字节数组) 得到的字符串 如果这还涉及客户保密信息,今晚他会合撒旦一起去你那里的
hztltgg 2021-04-25
  • 打赏
  • 举报
回复
原始文件如果有乱码,可能原始数据是gb2312,中间传输utf8,因为gb2312汉字是两个字节,utf8是三个字节,很可能最后一个字节在传输的过程中已经丢失了。 我试了下,如果你不在乎汉字丢失的话,用GB18030试试,可能可以读出来的。
wzyxs 2021-04-25
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
你放两个文本,一个你能正确解析的,一个你不能正确解析 这没有测试环境的情况下,就算俺们有心帮都无力
我试了半天传不了。。。。。原始文件有150M+,如果我只保留有问题的部分,用文本编辑器保存以后文件就变正常了。。。就像我上面说的,vs code里是显示后半个双引号的,用vs code保存以后再用ReadAllLines读取居然也能读到后半个双引号了 虽然压缩完不到6M,但文件里有客户保密信息,又不方便整个上传。。。。我改咋办
wzyxs 2021-04-25
  • 打赏
  • 举报
回复
嗯,原始文件就有乱码,其他软件导出的文本文件
wzyxs 2021-04-25
  • 打赏
  • 举报
回复
引用 7 楼 hztltgg 的回复:
原始文件如果有乱码,可能原始数据是gb2312,中间传输utf8,因为gb2312汉字是两个字节,utf8是三个字节,很可能最后一个字节在传输的过程中已经丢失了。 我试了下,如果你不在乎汉字丢失的话,用GB18030试试,可能可以读出来的。
其实程序根本不关心乱码内容是啥,只要能正确识别到后半个双引号让我顺利跳过乱码部分就行,另外就是要保证正常的gb2312编码的中文能被识别就行。查了下百科,GB18030对GB 2312-1980完全向后兼容,所以正常内容也不会出问题。双引号也能识别到我觉得应该是【GB 18030 编码是一二四字节变长编码】的原因,总之您的解答完美解决了我的问题,再次感谢!
wzyxs 2021-04-25
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
既然您不可能提供原始数据,那么就只能求助于上帝l了 还好刚才上帝传话说:乱码是不能通过改变字符集改正过来的,他请你读取前30 个字节的内容并贴出来 用 BitConverter.ToString(字节数组) 得到的字符串 如果这还涉及客户保密信息,今晚他会合撒旦一起去你那里的
上帝帮我解决了,lucky~
wzyxs 2021-04-25
  • 打赏
  • 举报
回复
引用 7 楼 hztltgg 的回复:
原始文件如果有乱码,可能原始数据是gb2312,中间传输utf8,因为gb2312汉字是两个字节,utf8是三个字节,很可能最后一个字节在传输的过程中已经丢失了。 我试了下,如果你不在乎汉字丢失的话,用GB18030试试,可能可以读出来的。
老哥稳!您是真人才!完美解决~您就是8楼口中的上帝!恭喜又多了一个信徒~
赵4老师 2021-04-25
  • 打赏
  • 举报
回复
判断一串字符是不是乱码用NLP ?
牧歌ing 2021-04-22
  • 打赏
  • 举报
回复
原始文件就有乱码?
wanghui0380 2021-04-21
  • 打赏
  • 举报
回复
你放两个文本,一个你能正确解析的,一个你不能正确解析 这没有测试环境的情况下,就算俺们有心帮都无力
Denuin多啦咧梦 2021-04-21
  • 打赏
  • 举报
回复
换成这试试: File.ReadAllLines(filePath, System.Text.Encoding.Default);
极客诗人 2021-04-19
  • 打赏
  • 举报
回复
按理说设置第二个参数Encoding就应该不会偏差。

111,088

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧