richTextBox1.LoadFile(openFileDialog1.FileName,RichTextBoxStreamType.PlainText);
打开txt文本文件,有的正常,有的乱码,该怎么解决?
txt文件有的ANSI编码,有的是UTF-8编码。
34 个解决方案
#1
#2
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试
#3
逐行读取添加到RichTextBox吗?
#4
用其他办法读吧
#5
比如呢?
#6
用FileStream加上StreamReader,StreamReader是可以选择读取文件的编码的。
#7
但是程序中只有openFileDialog1.FileName,不知道具体打开哪个文件,该文件的编码。
#8
先吧文件打开读取,扫描一遍,然后在按照指定格式保存.
ps 仅供小文件
ps 仅供小文件
#9
改变原始文件貌似不妥,有没有办法判断txt文件编码,然后按该编码打开文件?
#10
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。
#11
一般来说,按照通用规范来。例如互联网上通讯时你默认就要用 utf-8,不要用什么 gb2312,这就是好的规范。
#12
根治:统一编码 拨乱反正
救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件
救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件
#13
.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?
#14
那Windows记事本是如何正确打开不同编码的txt文件的?
#15
记事本是通过 BOM 头来判定文件内容的编码的
#16
.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?
#17
好像没有,都是自己写代码来判断的
但已知源编码和目标编码时,C#倒是提供了转换方法
但已知源编码和目标编码时,C#倒是提供了转换方法
#18
有现成的代码吗?
#19
网上有,一搜一大堆
#20
对,我也只是在别的回答里看过这个答案,没有试过
#21
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试
逐行读取添加到RichTextBox吗?
对,我也只是在别的回答里看过这个答案,没有试过
我试了,也有一种编码会乱码。
#22
那经常看到的读取txt里面参数设置编码为default那种会不会解决多编码的问题呢
#23
那经常看到的读取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
如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。
我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?
#26
说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?
#27
如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。
我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?
没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。
#28
说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?
明白了~
也就是说不是所有的txt文件都有BOM头?
#29
如果文件头部有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
如果文件头部有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
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。 根治:统一编码 拨乱反正
救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件
.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?
不知道有木有。。反正有我也打死不用,何苦。
还是直接约定好编码吧,搞那么复杂。用default和utf-8大概已经能够搞定了,喜欢玩小伎俩的,让ta自己一边玩去。。。
#32
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?
#33
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?
有空试一下看~
不过这样会改变原始文件。
#34
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?
用StreamWriter吗,请问代码该怎么写呢?
#1
#2
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试
#3
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试
逐行读取添加到RichTextBox吗?
#4
用其他办法读吧
#5
用其他办法读吧
比如呢?
#6
用FileStream加上StreamReader,StreamReader是可以选择读取文件的编码的。
#7
用FileStream加上StreamReader,StreamReader是可以选择读取文件的编码的。
但是程序中只有openFileDialog1.FileName,不知道具体打开哪个文件,该文件的编码。
#8
先吧文件打开读取,扫描一遍,然后在按照指定格式保存.
ps 仅供小文件
ps 仅供小文件
#9
先吧文件打开读取,扫描一遍,然后在按照指定格式保存.
ps 仅供小文件
改变原始文件貌似不妥,有没有办法判断txt文件编码,然后按该编码打开文件?
#10
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。
#11
一般来说,按照通用规范来。例如互联网上通讯时你默认就要用 utf-8,不要用什么 gb2312,这就是好的规范。
#12
根治:统一编码 拨乱反正
救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件
救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件
#13
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。
根治:统一编码 拨乱反正
救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件
.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?
#14
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。
那Windows记事本是如何正确打开不同编码的txt文件的?
#15
记事本是通过 BOM 头来判定文件内容的编码的
#16
记事本是通过 BOM 头来判定文件内容的编码的
.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?
#17
好像没有,都是自己写代码来判断的
但已知源编码和目标编码时,C#倒是提供了转换方法
但已知源编码和目标编码时,C#倒是提供了转换方法
#18
好像没有,都是自己写代码来判断的
但已知源编码和目标编码时,C#倒是提供了转换方法
有现成的代码吗?
#19
网上有,一搜一大堆
#20
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试
逐行读取添加到RichTextBox吗?
对,我也只是在别的回答里看过这个答案,没有试过
#21
我也遇到了同样的问题,用UTF-8保存的文件,读的时候没问题,别的中文的时候有乱码,通过AppendText(StreamReader.ReadLine)来写入RichTextBox,这样显示或许可以,你试试
逐行读取添加到RichTextBox吗?
对,我也只是在别的回答里看过这个答案,没有试过
我试了,也有一种编码会乱码。
#22
那经常看到的读取txt里面参数设置编码为default那种会不会解决多编码的问题呢
#23
那经常看到的读取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
如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。
我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?
#26
说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?
#27
如果文件头部有BOM,LoadFile不指定Encoding是能正确读取的,否则要自己判断编码。这Encoding类基本就是VCL TEncoding的翻版,用法属性相似度超过99%。
我VCL的TEncoding还没用过~
我用
frm.richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
测试几个txt文件,有的是乱码,有的正常。
自己判断编码,只知道文件名,怎么判断,.NET类库有这样的函数吗?
没有BOM,只能自己扫描一遍文件根据编码范围来判断,不可能百分之百准确,比如你用word打开一个无BOM的文本文件,它会列出几种可能的编码让你选。
#28
说了半天都是白说,楼主根本就没明白。
如果文件有BOM头,那么程序是可以取到编码,自动按照编码读取的。
如果没有BOM头那就只有写文件的人才知道用什么编码读取是合适的。
你还没明白吗?
明白了~
也就是说不是所有的txt文件都有BOM头?
#29
如果文件头部有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
如果文件头部有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
只有个别的文件有 BOM 标志内容,绝大部分文件是按照应用程序协议(例如用户可以编辑的系统配置)来自己管理字符编码行为的,从二进制文件并不能判断编码。 根治:统一编码 拨乱反正
救火:读取前,先尝试根据文本的前导符获得编码,再根据编码读取文件
.NET类库有没有一个函数来完成获得txt文件字符编码的功能呢?
不知道有木有。。反正有我也打死不用,何苦。
还是直接约定好编码吧,搞那么复杂。用default和utf-8大概已经能够搞定了,喜欢玩小伎俩的,让ta自己一边玩去。。。
#32
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?
#33
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?
有空试一下看~
不过这样会改变原始文件。
#34
你先读取进来,然后在按照你要的格式在存回去这样是不是可以?
用StreamWriter吗,请问代码该怎么写呢?