C#解决读写包含汉字的txt文件时乱码的问题.docx
《C#解决读写包含汉字的txt文件时乱码的问题.docx》由会员分享,可在线阅读,更多相关《C#解决读写包含汉字的txt文件时乱码的问题.docx(10页珍藏版)》请在冰豆网上搜索。
C#解决读写包含汉字的txt文件时乱码的问题
[C#]解决读写包含汉字的txt文件时乱码的问题
[C]解决读写包含汉字的#tx文t时件码乱的题.问tx心若t无尘一花,世界,一一鸟一堂。
天我曾喜经过你,现欢在依我然你爱望月希亮得照的到方都地可留以你下的笑那容些满飘的冬雪,天那个不带伞的少,年句被那挡门的誓言,那住被雪覆盖串再见[C#]的解决读写包含字的汉xt文t时件码乱的题问
我当用Sy们tes.mOI.StreaRmeaedr取包含汉字读tx的文件时,t经常会出读乱(码StramerWaietr文本文写也有类件的似题)问,因很原单,就简文是的件码(编encdion)g和SrteaRmeaedr/Witerr的nceoidg不n应。
对
了解决这个为题,问写了我个类一,取得一来个本文文件的neocdign这样,们我就可以建创对的应treSaRmeader和trSamerWtier读来写保证,会出不乱现现象。
码实原其理简很,单本编辑器(比文XP如自的带记事)在生本成本文件时文,如编果格式和系统默码认编的码(中系文下默统认GB2为12)3一致时,会不t在tx件文头开部分加添定特“编码的节字序识(标ncoEdngiBtiOrerMddka,写为B简M)”O,似PE类格的式M"Z"件文头这。
样在它取时就可以根读据这B个OM来定该确本文件文生时成使所的E用cnding。
o个这OB我们M记用本等事程序打开默是认看到的不但是用,steram字节按取时是读以读可的。
我到这个T的xtFleiEnodcin类就g根据是个这BOM文“件头”确定t来xt文件成生时到用编码的。
的
//
作者袁:
辉
晓
/ /0250--8
///8/////////
u
snigSsyetm
;
sinugSstye.Tmxe;t
us
ngSiyset.IOm;
na
esmacepFraprocT.ex
t
{
///
///用取得一于个文本文件编码的方式(nEcoding。
)
///
u uplibcclassTtFxleEniodincg
{
pubicTlxFtlieEcodinn(g)
{
//
/ /OTDO:
此在处加添构函造数逻辑
//
}
/// summa
r
/ //取得个文本文一的编码方件式。
果如法在文件无头部找到有效的前符,Enc导dong.iDefuatl被返回将
。
///
///p文件a名
>
///
s
pu libcsttiacEncodnigGtenEcdongis(trnigifleaNem)
{
rturenGetnEcoidn(giflNemae,Ecnoidn.Dgefult);a
}
/ //y
/// 取一个文本文得件流编码的式方。
////sum
///本文件。
>
///r/etruns>
r
pu lbicstatcincEoidngGtEecnoidng(FleSireamtsream)t
{
re trnGetuncEoingdstr(aemE,ncoing.Ddefula);t
}
?
// y
/ //取得一文个文本件的编码式。
方
//
y
/// 名。
>
// /默认编码方式。
"该方法无当法文从的件部取头有效得前导符时的将,回该返编码式方
> ///
ubplcitstaicEncdongiGteEconidgn(tsingrfielaNe,mEnocidgnefdaultEnocdngi)
{
Fi lSteeramf=snewFiletSerma(fleNiaem,ileMFdeoO.enp;
)
En cdongitaretgEnocdng=iGetEnocidgnf(,sdefaultnEocdig)n
;
sf.Close()
;
r eurtntagertEcnodng;
i
}
///
a
/
//取得一文个文本流件的码编式。
方
//
//"文文本流件
a
///p默认编方式。
当码该法方法无文从件的头取部有效得前的导符,时返回该编码将方式。
a
////retr
pbuilcsttiacncEodngietGEconidgn(FliStereasmretm,aEncdiogdenfaluEntcdoni)
g
{
nEcdiongargettnEocing=defaudtlEnodcnig;
i (fsrteam=!
nllu&&stear.meLgnht=>2)
{
/保存文/流的前4件字节个
byteb ye1=t0;
b yetbyte20=
;
by tebte3y=0;
bytebty4e=0;
/保/存前Se当k位置
e
onlgoigPorsst=rae.Seekm0(,SeeOrigkin.Bgeni);
st ermaS.ek(0e,eSkeOirign.egBni;)
i tnnBty=etrsaemRe.adytBe)(
;
ytbe1=Cnvoer.tTByteo(Bntye;
)
bte2=Cyovent.roTBye(strtame.RaeBdyet)(;
)
i fst(rea.Lmegtn>=h)
3
{
by et3=Cnoevrt.TBytoes(rtam.ReedaBty(e))
;
}
i(fsteam.reLnght>4)=
{
b te4y=CovenrtT.oyBe(sttrae.RmedByat(e))
;
}
//据文件流根前的个4节判字En断codig
n
//Unicoed{xFF,00xFE}
;
/BE-/Uncideo0{Fx,ExFF}0;
//UT F8{=x0EF,0xBB0x,F}B
;
i(byfe1t==0FxE&byte2&==0FxF)/Unico/edBe
{
tagrtenEodcing=Enocdni.giBEngidannicUdeo
;
}
i f(ybe1=t0xFF=&by&e2==txF0&E&byte!
3=xF0F)/Unicod/
e
{
tagrtEncodeingEnco=indgU.icnod;e
}
if(btey
1==0ExF&&byte2==0BxB&b&te3y==0BFx/)U/FT8
{
t agetErncdoingEnc=odngi.TU8;
F
}
/恢/复Sek位e置
s reat.mSekeori(Posg,SeekOigin.reBign;)
}
rteurntaretEncodigg;
n
}
}
}于由GB在213和U2FT编码7都有没OBM所以,需要定指个默认一E的coding,在n找不到合法B的MO,时将返回个这nEcdino。
g有知谁如何区分道GB322和1TUF7码t编t文件x方的,法请告也诉。
我由于只是staitc方,所以不用法enw,直接通类过调用名方法,用使起来也简很。
单
uingSssyem;t
sinugFrparc.oTxet;
usnigysSem.texTt;
uisnSygset.IOm
;
nmeasapeconColeApplscaiiton
1
{
// y
///lassC1的摘说明要。
///
>
cla sCslsas
1
{
/ /
y
//应/用序的主入程口。
点
/ /
STAThre[d]a
s taticvodiManis(rtni[gar]g)s
{
//
/ /ODO:
T此在处添代加码启动以用应程序
/
/
st rnigfieNalme=@":
\e.atxt;"
/ /成一生big个nediaUnncoid编码e式格文的本件文
S retamWirterswnewS=retaWmrteirfile(aNem,alfs,encoEindg.igEBdninUnaicoed)/;你/可以试试他其编码,如E比ncoding.GeEncodingt(G"2312"B或UTF8)
s w.rWte(i这"是一Str个ng");
i
swC.oles)(
;
//取
读
En codignfileEconindg=TxFtleincEodign.GtencodEin(gilfNemae,ncoEidgn.GetnEcodngi"(BG2312));"/取得/tx这t件文编码的
C osolne.rWteLiin(e这个文本"件的文码编为:
+"fieElcodinn.EgnodincgNae);m
treSmaRedaresr=newtreSmRaader(efilNamee,fileEcnodin)g//用该;编码创Str建emaReaed
r
/用下/面的法虽然方以可系让自统判动文本文断的件编格式码,但是我们无法取得该文本文的件编码
//s r.uCrentrncEoding永远为Unioced(TFU-8
)
/St/reamRaedresr=nwSteearmRaeed(frliNeam,etur)e;
//Cnsole.WorteLini("e个这文文件本的码为编"+:
s.CurrernEtnodicn.EgcnodngNaime)
;
onsoCe.lWitrLeie(n这个"文本件文的容内为:
+"srR.edaoTnE());d
s.Crlseo);(
oCsnlo.ReaeLdnie(;
)
}
}
}
NET下的.trsngi永是Unic远de的o,以只所能断判txt文件E的cndoig。
n于byt对e[,只有自己知道]它的Encdoin才能转换为sgtingr转为其换他编的by码e[t]一个例外是,整把个ttx文通过件tsrea读入mbyte[后也可]以据它的根前个字几节断E判cndon
ig,对于断片,们就无能我为力:
了)