字节流转化为string时乱码问题

abirdtofly 2012-02-24 03:17:15
string MyString="";
HttpPostedFileBase MyFile = Request.Files[0];
int FileLen;
System.IO.Stream MyStream;

FileLen = MyFile.ContentLength;
byte[] input = new byte[FileLen];
MyStream = MyFile.InputStream;
MyStream.Read(input, 0, FileLen);
MyString = System.Text.Encoding.Default.GetString(input);
如上程序,我上传的是word文件!但是读出来的MyString是乱码!各位大虾帮忙!!
...全文
661 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
abirdtofly 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wjq 的回复:]

Aspose.Words.Document d=new Aspose.Words.Document(new MemoryStream(input));
然后从d里取~具体参考Aspose组件的说明文档。
[/Quote]
首先谢谢WJq这么晚还回复!非常感谢!我会去试试的!
wjq 2012-02-26
  • 打赏
  • 举报
回复
Aspose.Words.Document d=new Aspose.Words.Document(new MemoryStream(input));
然后从d里取~具体参考Aspose组件的说明文档。
abirdtofly 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wjq 的回复:]

ASPOSE.WORDS组件可以直接读流,然后读word文档里的内容。
[/Quote]能给个简单的例子吗!我是小菜!谢谢
wjq 2012-02-26
  • 打赏
  • 举报
回复
ASPOSE.WORDS组件可以直接读流,然后读word文档里的内容。
abirdtofly 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wjq 的回复:]

lz你自己都说了他上传的是个word文件,word文件你说能直接转string么?!不管你用什么编码,必定有乱码。word文档字节流保存到服务器上之后,用word的com接口打开文件,读出内容。
[/Quote]
这个我是知道!我就是想直接不通过保存到本地!直接读取!想省去保存删除这个操作!不知道可不可以
wjq 2012-02-26
  • 打赏
  • 举报
回复
lz你自己都说了他上传的是个word文件,word文件你说能直接转string么?!不管你用什么编码,必定有乱码。word文档字节流保存到服务器上之后,用word的com接口打开文件,读出内容。
abirdtofly 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sp1234 的回复:]

简单地使用 System.Text.Encoding.Default,在不同的操作系统上就可能是不同的编码。例如同样的程序,你换到别人的操作系统上,可能执行结果就完全不一样了,因为System.Text.Encoding.Default会根据操作系统的设置而不同。
[/Quote]
我是初学者!嘿嘿!不太会!看了些资料才写出来的!具体还不会!希望各位大侠指点
  • 打赏
  • 举报
回复
简单地使用 System.Text.Encoding.Default,在不同的操作系统上就可能是不同的编码。例如同样的程序,你换到别人的操作系统上,可能执行结果就完全不一样了,因为System.Text.Encoding.Default会根据操作系统的设置而不同。
  • 打赏
  • 举报
回复
不要乱用 System.Text.Encoding.Default。该是什么就用什么编码。只有必须用时才用。

顺便问一下lz,你知道System.Text.Encoding.Default是什么编码吗?
abirdtofly 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chinajiyong 的回复:]

引用 8 楼 abirdtofly 的回复:

页面上没有设置!不应该就是默认的吗!是不是本身word就不能直接读出来!?

是有默认的啊,我记得NET默认好像是UTF-8,
[/Quote]
木有用!谁来个简单的例子!谢谢
EnForGrass 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 abirdtofly 的回复:]

页面上没有设置!不应该就是默认的吗!是不是本身word就不能直接读出来!?
[/Quote]
是有默认的啊,我记得NET默认好像是UTF-8,
abirdtofly 2012-02-24
  • 打赏
  • 举报
回复
页面上没有设置!不应该就是默认的吗!是不是本身word就不能直接读出来!?
EnForGrass 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chinajiyong 的回复:]

应该是编码问题
试一下GB2312
System.Text.Encoding.GetEncoding( "GB2312");
[/Quote]
页面的字符编码格式要设置一直,要么统一为UTF-8要么就GB2312
EnForGrass 2012-02-24
  • 打赏
  • 举报
回复
应该是编码问题
试一下GB2312
System.Text.Encoding.GetEncoding( "GB2312");
abirdtofly 2012-02-24
  • 打赏
  • 举报
回复
有人吗!求解啊!
abirdtofly 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 touzilk 的回复:]

word有图片吗
[/Quote]
没有!都是英文而且
手可摘星辰 2012-02-24
  • 打赏
  • 举报
回复
word有图片吗
abirdtofly 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 feng1366259807 的回复:]

System.Text.Encoding.Default.GetString(input);
把编码格式改成utf8试试
System.Text.Encoding.UTF8.GetString(input);
[/Quote]
试过无效!还是乱码!估计是1楼说的!但是不晓得如何对应word的编码
风2013 2012-02-24
  • 打赏
  • 举报
回复
System.Text.Encoding.Default.GetString(input);
把编码格式改成utf8试试
System.Text.Encoding.UTF8.GetString(input);
IO流: Input Output 输入输出流 自己去扩展: 1. 对象序列化和反序列化生成一个 2. 流的种类: io包下 扩展nio包下 1. IO分类: 输入流 输出流 字节流 InputStream(抽象类) OutputStream(抽象类) 字符流 Reader (抽象类) Writer(抽象类) 2.字节流:(重点) * 使用场景: * 1.字节流处理除了文本、文字相关所有的流问题,如,png/jpg/avi/map4/mp3/exe * 2.字符流只处理文本、文字相关(编码乱码问题) * * 1.输入流 abstract class InputStream:这个抽象类是表示输入字节流的所有类的超类。 * | * FileInputStream 子类:文件字节输入流 * 1. 构造方法 * FileInputStream(String name) name:表示(绝对路径、相对路径)文件名 * FileInputStream(File file) * * 2. 普通方法: //1. int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。 最常用 * //2. int read() 从输入流读取数据的下一个字节。 //3. int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。 * 2.输出流 abstract class OutputStream:这个抽象类是表示输出字节流的所有类的超类。 * | * FileOutputStream 子类:文件字节输出流 * 1. 构造方法 FileOutputStream(String name) name:表示(绝对路径、相对路径)文件名 FileOutputStream(String name, boolean append) append:表示是否在该文件末尾追加数据,如果为true,表示追加,false,表示从头开始覆盖 * FileOutputStream(File file) FileOutputStream(File file, boolean append) * * 2. 普通方法: //1. void write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。 最常用 * //2. void write(byte[] b)将 b.length个字节从指定的字节数组写入此文件输出流。 //3. void write(int b) 将指定的字节写入此文件输出流。 3. 注意事项: 1. 必须要关闭IO流,节约资源开销 2. 关闭IO流原则,先开后关 3. IO流工具类的抽取,将所有的关流(字节流和字符流)方法抽取出来,优化代码 4. 字符流:(重点) * 使用场景:使用于处理文本相关的文件 * * Reader 抽象类: * |子类 * InputStreamReader(转换流) * |子类 * FileReader:适用于读取字符相关的文件 * 1. 构造方法: * 1.FileReader(File file) 2.FileReader(String fileName) fileName:文件名(相对路径/绝对路径) * * 2. 读取方法: * 3. int read(char[] c)读取字符到char数组中 最常用 * 2. int read()读取一个字符 * 3. int read(char[] c,int start,int length)读取制定长度的字符到char数组中 * * Writer 抽象类: * |子类 * OutputStreamWriter(转换流) * |子类 * FileWriter:适用于写出字符相关的文件 * 1. 构造方法: * 1.FileWriter(File file) 默认是false 2.FileWriter(File file, boolean append) append:表示是在文件末尾追加还是从头覆盖,如果true追加,false覆盖,默认是false 3.FileWriter(String fileName) 默认是false 4.FileWriter(String fileName, boolean append) fileName:文件名(相对路径/绝对路径) * 2. 写出方法: * 1. public Writer append(CharSequence csq,int start,int end) * 2. public Writer append(char c) * 3. public Writer append(CharSequence csq) * 4. public void write(char[] c) * 5. public void write(String str) * 6. public void write(String str,int start,int end) 5. 乱码问题:(掌握) GBK: 中文2个字节 英文、数字:1字节 UTF-8: 中文3~6个字节 英文、数字:1字节 编码:将字符串转换为字节 * 1. byte[] getBytes() 根据默认字符集将当前字符串转换为字节数组 * 2. byte[] getBytes(String charsetName) UTF-8/GBK * 按照指定的字符集将将当前字符串转换为字节数组 * * 解码:将字节转换为字符 * 1.String(byte[] bytes, int offset, int length) * 根据默认字符集将字节数组中从指定下标开始到指定长度结束的数据转换为字符串 * * 2.String(byte[] bytes, int offset, int length, String charsetName) * 根据指定字符集将字节数组中从指定下标开始到指定长度结束的数据转换为字符串 * charsetName:字符集名 例如 : "GBK"、"UTF-8" 、"ISO-8859-1" * * 不常用 * 3.String(byte[] bytes) 根据默认字符集将字节数组转换为字符串 * 4.String(byte[] bytes, String charsetName) * 根据默认字符集将字节数组转换为字符串 * * 这里会有乱码问题: * 产生的原因: * 1、因为字符集不统一,即编码和解码new String(b,0,read,"gbk")字符集不一致 * 2、因为字节流读取汉字的候,字节数组长度不够,将一个汉字拆开了 * 解决: * 1. 用字符流用统一的字符集(最常用) * * 浏览器 : UTF-8 * 前台: * HTML :UTF-8 * CSS :UTF-8 * JS、JSP :UTF-8 * * 后台: * java :UTF-8 * * 数据库: * mysql、oracle、DB2 :UTF-8 * * 开发工具:UTF-8 * 2. 文本文件用统一的字符集 且用字符流读取和写出文本相关文件(最常用) * 3. 用一个大的字节数组(一般不用) 6. 转换流:(重点) 目前唯一一个可以设置字符集的流 (简单的理解为包装流,就是将字节流包装以下,方便操作文本相关的文件) * 使用场景: * 别人给提供了字节流,而需要处理文本文件,这候,就需要用转换流转换一下,更方便处理文本文件 * * 作用:就是一字符流的方式读取或写出文本相关的数据 * * InputStreamReader:将字节输入流包装一下,让其更适合读取文本文件 * 构造方法: * 1.InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。 * 2.InputStreamReader(InputStream in, String charsetName) 创建一个使用指定字符集的InputStreamReader。 * 普通方法: * public int read(char[] cbuf) * int read(char[] cbuf, int offset, int length) * OutputStreamWriter:将字节输出流包装一下,让其更适合写出文本文件 * 构造方法: * 1. OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。 * 2. OutputStreamWriter(OutputStream out, String charsetName) 创建一个使用指定字符集的OutputStreamWriter。 普通方法: void write(char[] cbuf, int off, int len) append(CharSequence csq,int start,int end) 只有转换流可以设置字符集 7. jdk7关流的新方式: 用新结构可以自动关流 前提:该流必须是实现了一个接口 AutoCloseable 语法: try( //只能写创建流的操作,不能写其他业务操作 ){ //可能有异常的代码 }catch(异常类型1 e){ }...不需要finally关流了 8. 缓冲流:(重点)包装流 * 1.概念: 提高读取和写出效率的流 * 2.作用: 提高效率 3.使用场景:以后一律都要使用,以提高效率 建议以后都是用字节或者字符数组的方式复制文件,这样效率最高 * 4. * BufferedInputStream * 字节输入缓冲流构造方法: 1.BufferedInputStream(InputStream

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧