今天发现一个很奇怪的问题,我做一个静态页面的自动生成
但是很奇怪的是
先看代码:
StreamReader sr = new StreamReader(@"d:\ExamplePage\Region.htm", System.Text.Encoding.GetEncoding("gb2312"));
string strTemp = sr.ReadToEnd();
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false);
sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"));这个其实应该是比较简单的,但是有个问题很奇怪,
在sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"))这里,如果不用这个(System.Text.Encoding.GetEncoding("gb2312")),那么我创建新文件里面的就是乱码(不报错)。但是如果我用了,就会报错“输入字符串的格式不正确”。我找了半天原因,终于找到了原因出现在“{”,“}”这两个字符上。如果我源文件里面有这两个字符,那么在执行sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"))就会报错。这是为什么啊?
我Read出来的数据没问题,直接写入文本框都是没有问题的,就是写入文本文件不是报错就是乱码,真是奇怪!我在线等,谢谢
但是很奇怪的是
先看代码:
StreamReader sr = new StreamReader(@"d:\ExamplePage\Region.htm", System.Text.Encoding.GetEncoding("gb2312"));
string strTemp = sr.ReadToEnd();
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false);
sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"));这个其实应该是比较简单的,但是有个问题很奇怪,
在sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"))这里,如果不用这个(System.Text.Encoding.GetEncoding("gb2312")),那么我创建新文件里面的就是乱码(不报错)。但是如果我用了,就会报错“输入字符串的格式不正确”。我找了半天原因,终于找到了原因出现在“{”,“}”这两个字符上。如果我源文件里面有这两个字符,那么在执行sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"))就会报错。这是为什么啊?
我Read出来的数据没问题,直接写入文本框都是没有问题的,就是写入文本文件不是报错就是乱码,真是奇怪!我在线等,谢谢
sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"));
StreamWrite.Write方法并没有这个重载,我不知道你是怎么编译通过的
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false,System.Text.Encoding.GetEncoding("gb2312"));
sw.Write(strTemp);
而且不写在这个,写在
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false, System.Text.Encoding.GetEncoding("gb2312"));
这里,问题也有。
我编译都通过了,不可能没有这个重载
是这个符号的问题,我用ReadLine读了的我替换后这个符号就不出问题了
你可以参考下,静态页面生成
而且不写在这个,写在
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false, System.Text.Encoding.GetEncoding("gb2312"));
我本来就是这个意思。你看清楚,我说的是Write方法没有你那个重载这是你的代码,
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false);
sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"));这还不是错的?
string strTemp = sr.ReadToEnd();
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\2.TXT", false);
sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"));
没问题啊
我哪里又自相矛盾了,我不想就这个问题进行讨论。很奇怪的是,我原来写的web上的代码完全没有问题,但是移植到windows上就有问题了。我我换FileStream来写文件,就没有问题。不过还是没搞懂为什么StreamWriter会出错
我已经给他说了三次了,他都舍不得去查。
自己看吧:名称 说明
StreamWriter.Write (Boolean) 将 Boolean 值的文本表示形式写入文本流。
StreamWriter.Write (Char) 将字符写入流。
由 .NET Compact Framework 支持。
StreamWriter.Write (Char[]) 将字符数组写入流。
由 .NET Compact Framework 支持。
StreamWriter.Write (Decimal) 将后面带有行结束符的十进制值的文本表示形式写入文本流。
StreamWriter.Write (Double) 将 8 字节浮点值的文本表示形式写入文本流。
StreamWriter.Write (Int32) 将 4 字节有符号整数的文本表示形式写入文本流。
StreamWriter.Write (Int64) 将 8 字节有符号整数的文本表示形式写入文本流。
StreamWriter.Write (Object) 通过在对象上调用 ToString 将此对象的文本表示形式写入文本流。
StreamWriter.Write (Single) 将 4 字节浮点值的文本表示形式写入文本流。
StreamWriter.Write (String) 将字符串写入流。
由 .NET Compact Framework 支持。
StreamWriter.Write (UInt32) 将 4 字节无符号整数的文本表示形式写入文本流。
StreamWriter.Write (UInt64) 将 8 字节无符号整数的文本表示形式写入文本流。
StreamWriter.Write (String, Object) 使用与 String.Format 相同的语义写出格式化的字符串。
StreamWriter.Write (String, Object[]) 使用与 String.Format 相同的语义写出格式化的字符串。
StreamWriter.Write (Char[], Int32, Int32) 将字符的子数组写入流。
由 .NET Compact Framework 支持。
StreamWriter.Write (String, Object, Object) 使用与 String.Format 相同的语义写出格式化的字符串。
StreamWriter.Write (String, Object, Object, Object) 使用与 String.Format 相同的语义写出格式化的字符串。 并没有一个StreamWriter.Write(String,Encoding)这个重载
所以实际上你调用的是
StreamWriter.Write (String, Object) 使用与 String.Format 相同的语义写出格式化的字符串。
这个方法!该方法把你传入的第二个参数当作格式字符串,而不是编码
所以你虽然“指望”是GB2312编码,但实际上仍是默认的UTF8编码!我给你再三解释,你还说我拿这Write方法不放!
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false, System.Text.Encoding.GetEncoding("gb2312"));
sw.Write(strTemp);为什么你能编译通过?
是因为:StreamWriter.Write(
string format,
Object arg0)
参数
format
类型:System..::.String格式化字符串。arg0
类型:System..::.Object要写入格式化字符串的对象StreamWriter.Write(
string format,
Object arg0,
Object arg1
)参数
format
类型:System..::.String格式化字符串。arg0
类型:System..::.Object要写入格式化字符串的对象。arg1
类型:System..::.Object要写入格式化字符串的对象。
上面有位兄弟也自己编译过了也说没问题,为什么你们老是搬个文档在那里说事,文档谁不会看啊?
sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312")); sw.Write(string format, Object arg0) arg0 格式化字符的对象... 是否是 System.Text.Encoding.GetEncoding("gb2312") 呢?
我对你彻底无语了!
恕我无能,你这个智商,我无法给你解释清楚。
自己验证吧:
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", false);
sw.Write(strTemp, System.Text.Encoding.GetEncoding("gb2312"));//把文件改成txt文件,比如c:\a.txt
然后打开这个文件,点文件菜单中的另存为命令,弹出一个对话框,看编码是ANSI,还是UTF8
只要你“稍微”有一点常识,就知道不可能有这样的重载,因为每个文本文件都有一个编码,照你那样的话:
StreamWriter sw...
string str="Hello,中国";
sw.Write(str,Encoding.UTF8);
sw.Write(str,Encoding.GetEncoding("gb2312"));
sw.Write(str,Encoding.Unicode);
那我这样,这个文件岂不是有多个编码?我不敢说你是CSDN上最菜的鸟,但是肯定是所有等级达到星级中最菜的了
鉴定完毕!
sw.Write(str,Encoding.UTF8);
sw.Write(str,Encoding.GetEncoding("gb2312"));
sw.Write(str,Encoding.Unicode);
上面这种写有什么错,我的理解就是,以Encoding.UTF8(或gb2312)现在的这种编码写入文件,有什么不行的
你刚才的代码实现的结果最多就是文本文件里面有三段,每一段的编码不一样,但是只能一种正常显示,其它的两种都是乱码。我一直对你比较客气,你自己去编译了之后再说。如果再有问题,麻烦你去重新发一个帖讨论,讨论完后过来给我说结果
sw.Write(strTemp);
StreamWriter sw = new StreamWriter(@"d:\TempPage\2.htm", System.Text.Encoding.GetEncoding("gb2312"));
sw.Write(strTemp);