RichTextBox用LoadFile打开txt文本文件,有的文件打开乱码怎么解决?

时间:2021-01-30 13:18:45

richTextBox1.LoadFile(openFileDialog1.FileName,RichTextBoxStreamType.PlainText);
打开txt文本文件,有的正常,有的乱码,该怎么解决?
txt文件有的ANSI编码,有的是UTF-8编码。

34 个解决方案

#1


RichTextBox用LoadFile打开txt文本文件,有的文件打开乱码怎么解决?

#2


我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试

#3


引用 2 楼 huasa2239635117 的回复:
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试


逐行读取添加到RichTextBox吗?

#4


用其他办法读吧

#5


引用 4 楼 MYsce 的回复:
用其他办法读吧


比如呢?

#6


用FileStream加上StreamReader,StreamReader是可以选择读取文件的编码的。

#7


引用 6 楼 KW239的回复:
用FileStream加上StreamReader,StreamReader是可以选择读取文件的编码的。

但是程序中只有openFileDialog1.FileName,不知道具体打开哪个文件,该文件的编码。

#8


先吧文件打开读取,扫描一遍,然后在按照指定格式保存.   
ps 仅供小文件

#9


引用 8 楼 w574495524 的回复:
先吧文件打开读取,扫描一遍,然后在按照指定格式保存.   
ps 仅供小文件


改变原始文件貌似不妥,有没有办法判断txt文件编码,然后按该编码打开文件?

#10


只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。

#11


一般来说,按照通用规范来。例如互联网上通讯时你默认就要用 utf-8,不要用什么 gb2312,这就是好的规范。

#12


根治:统一编码 拨乱反正

救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件

#13


引用 10 楼 sp1234 的回复:
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。



引用 12 楼 zhi_ai_yaya 的回复:
根治:统一编码 拨乱反正

救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件


.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?

#14


引用 10 楼 sp1234 的回复:
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。


那Windows记事本是如何正确打开不同编码的txt文件的?

#15


记事本是通过 BOM 头来判定文件内容的编码的

#16


引用 15 楼 xuzuning 的回复:
记事本是通过 BOM 头来判定文件内容的编码的


.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?

#17


好像没有,都是自己写代码来判断的
但已知源编码和目标编码时,C#倒是提供了转换方法

#18


引用 17 楼 xuzuning 的回复:
好像没有,都是自己写代码来判断的
但已知源编码和目标编码时,C#倒是提供了转换方法


有现成的代码吗? RichTextBox用LoadFile打开txt文本文件,有的文件打开乱码怎么解决?

#19


网上有,一搜一大堆

#20


引用 3 楼 u010165006 的回复:
Quote: 引用 2 楼 huasa2239635117 的回复:

我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试


逐行读取添加到RichTextBox吗?


对,我也只是在别的回答里看过这个答案,没有试过

#21


引用 20 楼 huasa2239635117 的回复:
Quote: 引用 3 楼 u010165006 的回复:

Quote: 引用 2 楼 huasa2239635117 的回复:

我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试


逐行读取添加到RichTextBox吗?


对,我也只是在别的回答里看过这个答案,没有试过


我试了,也有一种编码会乱码。

#22


那经常看到的读取txt里面参数设置编码为default那种会不会解决多编码的问题呢

#23


引用 22 楼 hjq624779687 的回复:
那经常看到的读取txt里面参数设置编码为default那种会不会解决多编码的问题呢


我试了四种方法:
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                frmEdit frm = new frmEdit();
                frm.Text = openFileDialog1.FileName;
                StreamReader sr = new StreamReader(openFileDialog1.FileName,Encoding.Default); //A
                frm.richTextBox1.Text = sr.ReadToEnd();
      //          frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); //B
      //          frm.richTextBox1.Text = File.ReadAllText(openFileDialog1.FileName); //C
      //          string[] fileContent = File.ReadAllLines(openFileDialog1.FileName); //D
      //          foreach (string s in fileContent)
      //              frm.richTextBox1.AppendText(s);
                frm.MdiParent = this;
                frm.Show();
            }

ANSI和UTF-8两种编码文件总有一种乱码,而且四种方法两种是ANSI的乱码,两种是UTF-8的乱码。

#24


如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。

#25


引用 24 楼 DelphiGuy 的回复:
如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?

#26


说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?

#27


引用 25 楼 u010165006 的回复:
Quote: 引用 24 楼 DelphiGuy 的回复:

如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?


没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。

#28


引用 26 楼 wddw1986 的回复:
说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?


明白了~
也就是说不是所有的txt文件都有BOM头?

#29


引用 27 楼 DelphiGuy 的回复:
Quote: 引用 25 楼 u010165006 的回复:

Quote: 引用 24 楼 DelphiGuy 的回复:

如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?


没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。


就是说有的txt文件没有BOM头?那Windows记事本打开还都是对的。

#30


引用 29 楼 u010165006 的回复:
Quote: 引用 27 楼 DelphiGuy 的回复:

Quote: 引用 25 楼 u010165006 的回复:

Quote: 引用 24 楼 DelphiGuy 的回复:

如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?


没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。


就是说有的txt文件没有BOM头?那Windows记事本打开还都是对的。


txt打开也不全是对的,有的文本可以理解成2种编码,txt也会错的

#31


引用 13 楼 u010165006 的回复:
Quote: 引用 10 楼 sp1234 的回复:

只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。



引用 12 楼 zhi_ai_yaya 的回复:
根治:统一编码 拨乱反正

救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件


.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?


不知道有木有。。反正有我也打死不用,何苦。
还是直接约定好编码吧,搞那么复杂。用default和utf-8大概已经能够搞定了,喜欢玩小伎俩的,让ta自己一边玩去。。。 RichTextBox用LoadFile打开txt文本文件,有的文件打开乱码怎么解决?

#32


你先读取进来,然后在按照你要的格式在存回去这样是不是可以?

#33


引用 32 楼 w574495524 的回复:
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?


有空试一下看~
不过这样会改变原始文件。

#34


引用 32 楼 w574495524 的回复:
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?


用StreamWriter吗,请问代码该怎么写呢?

#1


RichTextBox用LoadFile打开txt文本文件,有的文件打开乱码怎么解决?

#2


我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试

#3


引用 2 楼 huasa2239635117 的回复:
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试


逐行读取添加到RichTextBox吗?

#4


用其他办法读吧

#5


引用 4 楼 MYsce 的回复:
用其他办法读吧


比如呢?

#6


用FileStream加上StreamReader,StreamReader是可以选择读取文件的编码的。

#7


引用 6 楼 KW239的回复:
用FileStream加上StreamReader,StreamReader是可以选择读取文件的编码的。

但是程序中只有openFileDialog1.FileName,不知道具体打开哪个文件,该文件的编码。

#8


先吧文件打开读取,扫描一遍,然后在按照指定格式保存.   
ps 仅供小文件

#9


引用 8 楼 w574495524 的回复:
先吧文件打开读取,扫描一遍,然后在按照指定格式保存.   
ps 仅供小文件


改变原始文件貌似不妥,有没有办法判断txt文件编码,然后按该编码打开文件?

#10


只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。

#11


一般来说,按照通用规范来。例如互联网上通讯时你默认就要用 utf-8,不要用什么 gb2312,这就是好的规范。

#12


根治:统一编码 拨乱反正

救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件

#13


引用 10 楼 sp1234 的回复:
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。



引用 12 楼 zhi_ai_yaya 的回复:
根治:统一编码 拨乱反正

救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件


.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?

#14


引用 10 楼 sp1234 的回复:
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。


那Windows记事本是如何正确打开不同编码的txt文件的?

#15


记事本是通过 BOM 头来判定文件内容的编码的

#16


引用 15 楼 xuzuning 的回复:
记事本是通过 BOM 头来判定文件内容的编码的


.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?

#17


好像没有,都是自己写代码来判断的
但已知源编码和目标编码时,C#倒是提供了转换方法

#18


引用 17 楼 xuzuning 的回复:
好像没有,都是自己写代码来判断的
但已知源编码和目标编码时,C#倒是提供了转换方法


有现成的代码吗? RichTextBox用LoadFile打开txt文本文件,有的文件打开乱码怎么解决?

#19


网上有,一搜一大堆

#20


引用 3 楼 u010165006 的回复:
Quote: 引用 2 楼 huasa2239635117 的回复:

我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试


逐行读取添加到RichTextBox吗?


对,我也只是在别的回答里看过这个答案,没有试过

#21


引用 20 楼 huasa2239635117 的回复:
Quote: 引用 3 楼 u010165006 的回复:

Quote: 引用 2 楼 huasa2239635117 的回复:

我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试


逐行读取添加到RichTextBox吗?


对,我也只是在别的回答里看过这个答案,没有试过


我试了,也有一种编码会乱码。

#22


那经常看到的读取txt里面参数设置编码为default那种会不会解决多编码的问题呢

#23


引用 22 楼 hjq624779687 的回复:
那经常看到的读取txt里面参数设置编码为default那种会不会解决多编码的问题呢


我试了四种方法:
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                frmEdit frm = new frmEdit();
                frm.Text = openFileDialog1.FileName;
                StreamReader sr = new StreamReader(openFileDialog1.FileName,Encoding.Default); //A
                frm.richTextBox1.Text = sr.ReadToEnd();
      //          frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); //B
      //          frm.richTextBox1.Text = File.ReadAllText(openFileDialog1.FileName); //C
      //          string[] fileContent = File.ReadAllLines(openFileDialog1.FileName); //D
      //          foreach (string s in fileContent)
      //              frm.richTextBox1.AppendText(s);
                frm.MdiParent = this;
                frm.Show();
            }

ANSI和UTF-8两种编码文件总有一种乱码,而且四种方法两种是ANSI的乱码,两种是UTF-8的乱码。

#24


如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。

#25


引用 24 楼 DelphiGuy 的回复:
如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?

#26


说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?

#27


引用 25 楼 u010165006 的回复:
Quote: 引用 24 楼 DelphiGuy 的回复:

如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?


没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。

#28


引用 26 楼 wddw1986 的回复:
说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?


明白了~
也就是说不是所有的txt文件都有BOM头?

#29


引用 27 楼 DelphiGuy 的回复:
Quote: 引用 25 楼 u010165006 的回复:

Quote: 引用 24 楼 DelphiGuy 的回复:

如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?


没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。


就是说有的txt文件没有BOM头?那Windows记事本打开还都是对的。

#30


引用 29 楼 u010165006 的回复:
Quote: 引用 27 楼 DelphiGuy 的回复:

Quote: 引用 25 楼 u010165006 的回复:

Quote: 引用 24 楼 DelphiGuy 的回复:

如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。


我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText); 
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?


没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。


就是说有的txt文件没有BOM头?那Windows记事本打开还都是对的。


txt打开也不全是对的,有的文本可以理解成2种编码,txt也会错的

#31


引用 13 楼 u010165006 的回复:
Quote: 引用 10 楼 sp1234 的回复:

只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。



引用 12 楼 zhi_ai_yaya 的回复:
根治:统一编码 拨乱反正

救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件


.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?


不知道有木有。。反正有我也打死不用,何苦。
还是直接约定好编码吧,搞那么复杂。用default和utf-8大概已经能够搞定了,喜欢玩小伎俩的,让ta自己一边玩去。。。 RichTextBox用LoadFile打开txt文本文件,有的文件打开乱码怎么解决?

#32


你先读取进来,然后在按照你要的格式在存回去这样是不是可以?

#33


引用 32 楼 w574495524 的回复:
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?


有空试一下看~
不过这样会改变原始文件。

#34


引用 32 楼 w574495524 的回复:
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?


用StreamWriter吗,请问代码该怎么写呢?