大家看看这段代码,为何得到这种结果? 本帖最后由 xx_mm 于 2010-05-16 21:10:21 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用Encoding.Default.GetString(dataArray)就能得到你的乱码。 在byte数组中存入的就是这样,就想用java代码中的流把数据库中的数据存入一个txt文件中一样,你可以用Encoding.Default.GetString(dataArray)把byte中的值读取出来! 嗯,确实,可我不知道一个byte类型数组就这么行,得到的竟然是乱码?明明数组里存的是一些小于255的数字丫? 怎么会这样呢???? 原因就是你要去看编码标准例如utf-8http://www.utf8.com/像utf-8就是一个汉字三个字节。你可以for(int i=1;i<10000;i++) { Console.WriteLine((char)i); }看看都出来什么字符。 还是不明白!!uft-8编码一个汉字三个字节,可是系统默认的Default是GB2312 ,我不明白为什么byte类型转化为字符串就变成乱码?原理是什么?那根for(int i=1;i<10000;i++) { Console.WriteLine((char)i); }也没关系啊??!! 你存的是二进制文件,却用文本编辑器打开,自然不行了,用专门的二进制文件查看器去看,不就是正常的了吗。http://dl.pconline.com.cn/html_2/1/59/id=6368&pn=0&linkPage=1.html 我也不知道怎么给你解释。 string teststring = "大家看看这段代码,为何得到这种结果?"; Byte[] testbuffer = Encoding.UTF8.GetBytes(teststring); File.Delete("test.txt"); FileStream fs = new FileStream("test.txt", FileMode.OpenOrCreate); fs.Write(testbuffer, 0, testbuffer.Length); byte[] newline = Encoding.UTF8.GetBytes("\r\n"); foreach (Byte testbyte in testbuffer) { fs.Write(newline, 0, newline.Length); string testbytestring = testbyte.ToString(); byte[] testbytevalue = Encoding.UTF8.GetBytes(testbytestring); fs.Write(testbytevalue, 0, testbytevalue.Length); } fs.Close();这个文件输出时什么?大家看看这段代码,为何得到这种结果?229164167229174182231156139231156139232191153230174181228187163231160129239188140228184186228189149229190151229136176232191153231167141231187147230158156239188159也就是说229164167这三个byte构成了"大"这个字。至于这个为什么会是这样,怎么是这样,是人家utf-8标准定制。你只需要知道就行。 是谁告诉你是小于255的数字的?晕啊,恕我直言:基础知识了的你的一个NextBytes,直接产生0到65535间的数字,一个Byte(字节)有8个bit(比特),一般英文单词只占一个word(字)也就是4位bit,也就是说你把他们合并到流中时,他们就以数据的形式保存(此例便是),有入口函数的就以命令形式保存,这个就是以你的流写成的数据,你用文本打开,记事本程序会以对应编码翻译每字节,如果值太大或太小(不在编码范围内的)就会轮空,自然出现乱码了,这个是数据存储的形式和编码是什么没有关系,和你拿记事本开exe文件一样的。这个汇编语言第一章都有说看看吧。 byte是8位的,你用记事本读的时候可能是16位的,比如你存的是 "ABC" 三个字符 系统保存的二进制可能就是"00123456 00234567 00345678"(假设)你在用记事本读的时候,他默认用16进制读,一次读两个字节,"00123456 00234567"这段二进制代码在16进制的字符库里可能代表符号"憈", "00345678"不够16位,系统自动补0补够16位,得到的二进制可能代表的是"賄"所以你存进去的字符"ABC",换个编码就成了"憈賄"了,其实磁盘上存的还是那些二进制数据,是不会变的.只是你用的编码库显示的时候将他们转换了一下 睡了一觉,更加清醒了,把语言整理了一下,更加直白:在生成的byte,如随机出了97和98,也就是这个时候流的值为61h和62h,通常编码查询的时候应该分别为小写的'a'和'b'才对。然而,你的流中没有明显的标示说只取一个字节(正常的编码中都有是否取单字节标示),很多编码是双字节d读取的(如汉字),也就是读取一个字单元的,它会把61h当低位62h当高位读出6261h也就是25185这个码,然后会以这个码到码表中查找,如果超出了范围,自然是乱码了。ps:今后酒后不回帖了 呵呵~~ 谢谢大哥了~ 可这句话不懂:它会把61h当低位62h当高位读出6261h也就是25185这个码~~ 别见笑哦~还有这句:流的值为61h和62h,怎么来的~ 带h的说明是16进制,如果是6E h的话可能你会更加明白些,字单元是由两个字节组成,在内存中前边的8位bit(也就是前边的byte)叫低位,后边的byte叫高位,也是人们常说的高8、低8在内存中是先存低位、再存高位:例如:十进制:270 应该写成十六进制: 010E但是再内存中,他是以 0E 01 方式排的,就是低位在前,高位在后PS:如果还想了解详细的话,建议买本汇编语言的书看一下,会给你的思想有许多启发,真的,感觉约束少了清爽了许多,世界一下美好了起来。废话完。 sys.webforms.pagerequestmanagerservererrorexception这个错误如何解决? C# 如何将图片另存为单色位图bmp datagridview 格式显示 绑定问题? datarow插入的问题 服务器流程 如何去掉IE的状态栏 急!C# 知道内存地址,如何读取数据显示到窗口? 技术大攻关:如何在页面上嵌入一个Excel表!!!(要多少分就给多少分) 如何捕捉用户点击关闭钮时产生的事件? 关于嵌入式开发,寻求支持 socket 异步通信的问题
例如utf-8
http://www.utf8.com/像utf-8就是一个汉字三个字节。你可以
for(int i=1;i<10000;i++)
{
Console.WriteLine((char)i);
}看看都出来什么字符。
还是不明白!!uft-8编码一个汉字三个字节,可是系统默认的Default是GB2312 ,我不明白为什么byte类型转化为字符串就变成乱码?原理是什么?
那根
for(int i=1;i<10000;i++)
{
Console.WriteLine((char)i);
}
也没关系啊??!!
http://dl.pconline.com.cn/html_2/1/59/id=6368&pn=0&linkPage=1.html
string teststring = "大家看看这段代码,为何得到这种结果?";
Byte[] testbuffer = Encoding.UTF8.GetBytes(teststring);
File.Delete("test.txt");
FileStream fs = new FileStream("test.txt", FileMode.OpenOrCreate);
fs.Write(testbuffer, 0, testbuffer.Length);
byte[] newline = Encoding.UTF8.GetBytes("\r\n");
foreach (Byte testbyte in testbuffer)
{
fs.Write(newline, 0, newline.Length);
string testbytestring = testbyte.ToString();
byte[] testbytevalue = Encoding.UTF8.GetBytes(testbytestring);
fs.Write(testbytevalue, 0, testbytevalue.Length);
}
fs.Close();这个文件输出时什么?
大家看看这段代码,为何得到这种结果?
229
164
167
229
174
182
231
156
139
231
156
139
232
191
153
230
174
181
228
187
163
231
160
129
239
188
140
228
184
186
228
189
149
229
190
151
229
136
176
232
191
153
231
167
141
231
187
147
230
158
156
239
188
159也就是说229
164
167这三个byte构成了"大"这个字。至于这个为什么会是这样,怎么是这样,是人家utf-8标准定制。你只需要知道就行。
是谁告诉你是小于255的数字的?晕啊,恕我直言:基础知识了的你的一个NextBytes,直接产生0到65535间的数字,一个Byte(字节)有8个bit(比特),一般英文单词只占一个word(字)也就是4位bit,也就是说你把他们合并到流中时,他们就以数据的形式保存(此例便是),有入口函数的就以命令形式保存,这个就是以你的流写成的数据,你用文本打开,记事本程序会以对应编码翻译每字节,如果值太大或太小(不在编码范围内的)就会轮空,自然出现乱码了,这个是数据存储的形式和编码是什么没有关系,和你拿记事本开exe文件一样的。这个汇编语言第一章都有说看看吧。
byte是8位的,你用记事本读的时候可能是16位的,比如你存的是 "ABC" 三个字符 系统保存的二进制可能就是"00123456 00234567 00345678"(假设)你在用记事本读的时候,他默认用16进制读,一次读两个字节,"00123456 00234567"这段二进制代码在16进制的字符库里可能代表符号"憈", "00345678"不够16位,系统自动补0补够16位,得到的二进制可能代表的是"賄"
所以你存进去的字符"ABC",换个编码就成了"憈賄"了,其实磁盘上存的还是那些二进制数据,是不会变的.只是你用的编码库显示的时候将他们转换了一下
在生成的byte,如随机出了97和98,也就是这个时候流的值为61h和62h,通常编码查询的时候应该分别为小写的'a'和'b'才对。然而,你的流中没有明显的标示说只取一个字节(正常的编码中都有是否取单字节标示),很多编码是双字节d读取的(如汉字),也就是读取一个字单元的,它会把61h当低位62h当高位读出6261h也就是25185这个码,然后会以这个码到码表中查找,如果超出了范围,自然是乱码了。ps:今后酒后不回帖了
例如:十进制:270 应该写成十六进制: 010E
但是再内存中,他是以 0E 01 方式排的,就是低位在前,高位在后PS:如果还想了解详细的话,建议买本汇编语言的书看一下,会给你的思想有许多启发,真的,感觉约束少了清爽了许多,世界一下美好了起来。废话完。