志在指尖
用双手敲打未来

streamreader中文乱码(解决办法)

streamreader中文乱码

原因是自Windows2000之后的操作系统在文件处理时默认编码选用Unicode
所以.NET文件的默认编码也是Unicode。除非别的指定,StreamReader的默认编码为Unicode,
而不是当前系统的ANSI代码页。但是文档大部分还是以ANSI编码存储,中文文本运用的是GB2312,所以才造成中文乱码
所以在读取文本的时候要指定编码格式。
运用System.Text.Encoding.Defaul告诉StreamReader选用目前操作系统的编码即可。
如:
FileStreamfs=newFileStream(“1.txt”,FileMode.Open,FileAccess.Read);
StreamReaderread=newStreamReader(fs,Encoding.Default);
stringstr;
while(read.Peek()!=-1)
{
str=read.ReadLine();
Console.WriteLine(str);
}
read.Close();
没有整理与归纳的常识,一文不值!高度归纳与整理的常识,才是自己真实的常识与技能。永久不要让自己的自在、猎奇、充满创造力的想法被实际的结构所束缚,让创造力自在成长吧!多花时间,关心他(她)人,正如他人所关心你的。抱负的腾飞与实现,没有他人的支持与协助,是万万不能的。

streamreader中文乱码解决办法

相信很多人在读取文件的时分都会碰到乱码的状况,所谓乱码便是紊乱的编码的意思,形成乱码的是因为编码不共同导致的。
演示程序:
新建3个文本文件:
clip_image002?
编码和名字一样,分别是ansi,Unicode,utf8
里边的内容都是:
~!@#¥%……&*()
abcdefg
123456789
测试数据
clip_image004
clip_image006
clip_image008
读取这些文件的代码如下:
publicstaticvoidMain()
{
List<string>lstFilePath=newList<string>()
{
“H:\\TestText\\ansi.txt”,
“H:\\TestText\\unicode.txt”,
“H:\\TestText\\utf8.txt”
};
foreach(stringfilePathinlstFilePath)
{
using(StreamReaderreader=newStreamReader(filePath))
{
Console.WriteLine(“读取文件”+filePath);
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine(“************************************************************”);
}
}
}
输收支下:
clip_image010
因为第一个文件运用ansi编码,但是StreamReader的默认构造函数运用的是utf8编码,所以乱码了。
StreamReader旨在以一种特定的编码输入字符,而Stream类用于字节的输入和输出。运用StreamReader读取规范文本文件的各行信息。
除非别的指定,StreamReader的默认编码为UTF-8,而不是当时系统的ANSI代码页。UTF-8能够正确处理Unicode字符并在操作系统的本地化版别上提供共同的成果。
所以处理上面的编码问题的处理方案是运用StreamReader,而且传递Encoding.Default作为编码,一般在中文操作系统中,Encoding.Default是Gb2312编码。
publicstaticvoidMain()
{
List<string>lstFilePath=newList<string>()
{
“H:\\TestText\\ansi.txt”,
“H:\\TestText\\unicode.txt”,
“H:\\TestText\\utf8.txt”
};
foreach(stringfilePathinlstFilePath)
{
using(StreamReaderreader=newStreamReader(filePath,Encoding.Default))
{
Console.WriteLine(“读取文件”+filePath);
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine(“************************************************************”);
}
}
}
输出如下:
clip_image012
从这儿得到一个结论:运用StreamReader,而且运用Encoding.Default作为编码。
很可惜,上面的这个结论在某些状况下页会存在问题,例如在你的操作系统中Encoding.Default是Encoding.UTF8的时分。
最完美的处理方案是:文件运用什么编码保存的,就用什么编码来读取。
那怎么得到文件的编码呢?
运用下面的代码就能够了:
代码如下:
publicstaticEncodingGetEncoding(stringfilePath)
{
if(filePath==null)
{
thrownewArgumentNullException(“filePath”);
}
Encodingencoding1=Encoding.Default;
if(File.Exists(filePath))
{
try
{
using(FileStreamstream1=newFileStream(filePath,FileMode.Open,FileAccess.Read))
{
if(stream1.Length>0)
{
using(StreamReaderreader1=newStreamReader(stream1,true))
{
char[]chArray1=newchar[1];
reader1.Read(chArray1,0,1);
encoding1=reader1.CurrentEncoding;
reader1.BaseStream.Position=0;
if(encoding1==Encoding.UTF8)
{
byte[]buffer1=encoding1.GetPreamble();
if(stream1.Length>=buffer1.Length)
{
byte[]buffer2=newbyte[buffer1.Length];
stream1.Read(buffer2,0,buffer2.Length);
for(intnum1=0;num1<buffer2.Length;num1++)
{
if(buffer2[num1]!=buffer1[num1])
{
encoding1=Encoding.Default;
break;
}
}
}
else
{
encoding1=Encoding.Default;
}
}
}
}
}
}
catch(Exceptionexception1)
{
throw;
}
if(encoding1==null)
{
encoding1=Encoding.UTF8;
}
}
returnencoding1;
}
这段代码运用encoding1.GetPreamble()办法来得到编码的字节序列,然后重新读取数据,比较数据,如果不相同则阐明是Encoding.Default.
否则是Encoding.Utf8.
有了GetEncoding(filename)办法后,能够将上面的读取代码修正如下:
publicstaticvoidMain()
{
List<string>lstFilePath=newList<string>()
{
“H:\\TestText\\ansi.txt”,
“H:\\TestText\\unicode.txt”,
“H:\\TestText\\utf8.txt”
};
foreach(stringfilePathinlstFilePath)
{
using(StreamReaderreader=newStreamReader(filePath,GetEncoding(filePath)))
{
Console.WriteLine(“读取文件”+filePath);
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine(“当时编码:”+reader.CurrentEncoding.EncodingName);
Console.WriteLine(“************************************************************”);
}
}
}
输出如下:
clip_image002
从这儿能够看到ansi编码,Encoding.Default便是简体中文(GB2312)

未经允许不得转载:IT技术网站 » streamreader中文乱码(解决办法)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载