关于C#用Write()写入流的问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 04:33:48
有程序如下:
using System;
using System.IO;
using System.Text;

namespace _06_05
{
public class Class_06_05
{
public static void Main(String[] args)
{
// 获取输出流
Stream s = Console.OpenStandardOutput();

string str1 = "Hello, world.";
string str2 = "你好,C#";

ASCIIEncoding ascii = new ASCIIEncoding();
byte[] bytes1 = ascii.GetBytes(str1);
byte[] bytes2 = ascii.GetBytes(str2);

s.Write(bytes1, 0, bytes1.Length);
Console.WriteLine();
s.Write(bytes2, 0, bytes2.Length);

s.Close();
}
}
}
在我认为,程序运行结果应是str1和str2两字符串转化为ASCII值的数字序列,可当我运行后却是:
Hello,world.
???C#
这是怎么回事?
再给详细讲解一下下面的片段:
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] bytes1 = ascii.GetBytes(str1);
byte[] bytes2 = ascii.GetBytes(str2);

当你要显示流的内容时,系统会自动以默认的unicode字符集显示流中的字节串.

ASCIIEncoding ascii = new ASCIIEncoding();// 这里是产生一个编解码的对象.
ASCII字符集中只有128个字符(英文和其他的一些符号).当遇到大于127的字符时就无法编解码.用'?'替代.

如果要对中文编码要使用支持中文字符集的编码.比如(unicode系列.GB2312)
byte[] bytes1 = Encoding.Default.GetBytes(str1);// 采用系统的语言编码, 简体中文版的是GB2312编码.
或者byte[] bytes1 = Encoding.UTF8.GetBytes(str1);// 采用UTF8编码

汉字的编码是这样的:
一共有65536个字符
0-127的和ASCII的一样.大于127的是一些中文,日文和一些特殊的符号等.
小于127时,用单字节表示.
大于127时,用双字节表示.其中第一个字节大于127
这样系统在读取字节时发现如果一个字节大于127时就会再读取一个字节来组成一个双字节的字符.然后解码.

例如:
Encoding.GetEncoding("gb2312").GetBytes("中") //得到 214,208
Encoding.ASCII.GetBytes("中") // 得到 63

ASCII没有中文的


ASCIIEncoding ascii = new ASCIIEncoding();
byte[] bytes1 = ascii.GetBytes(str1);
byte[] bytes2 = ascii.GetBytes(str2);
修改为
byte[] bytes1 = System.Text.Encoding.Default.GetBytes(str1);
byte[] bytes2 = System.Tex