Java byte数组转换成String 乱码的问题

zhuyouyong 2013-12-16 02:44:13
代码如下所示


byte[] bytes = new byte[] { 50, 0, -1, 28, -24 };
String sendString = "";
try {
sendString=new String(bytes ,"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO 尚未处理异常
e.printStackTrace();
}
System.out.println(sendString);


想把字节码数组转换成String类型,用于网络传输,但是转换后发现String都是乱码,webService传输也是报错的,希望大家能帮忙解决。
...全文
38114 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
对了,还有一个关键的东西 String 是跨操作系统的,跨开发语言的. 如果你开发的 webservice 给出一个 String 不管对方是什么系统,什么程序都可以用你的服务, 你可以做成云.....
guishuanglin 2013-12-31
  • 打赏
  • 举报
回复
楼主,webservice 是可以转对象数组,但是对象序列化要大量时间,性能很差的, 我们测试中转 20个字段 3000行的bean数组要 20多秒(你说byte只能2000这个不理解,因为我们项目用传5000数组的bean都有), webservice 性能最高是只传一个约定格式的 String, 然后对方转换,为什么呢? 1 bean[3000]数组 ,bean 有20个字段 序列化次数为: 3000*20+1=60001 次, 双方都转就有: 60001*2=120002次, 花掉大量的传输,转换时间,并且不灵活(bean一变,人家要跟着变,否则对方报错,这是强依赖!). 2 如果自己转成 String(任何数据都能转成String), 双方只要实例化 2次 ......, 并且你增加东西,不影响对方的程序,他可以不读取增加部分. 3 你可能会问,自己转换麻烦,并且也要时间, 但是内存操作的时间程序中基本让可以不计!!
zhuyouyong 2013-12-20
  • 打赏
  • 举报
回复
引用 9 楼 guishuanglin 的回复:
你就这么点数据 webservice 完全没问题,我用webservice送过 30万行xml,约有50M大完全没问题. 主要是在编码转换问题上: byte[] bytes = new byte[] { 50, 0, -1, 28, -24 }; 你才5个字节,如果有汉字会出错的, utf-8是三字节一个汉字,不信用你汉字转一下: "汉".getBytes("utf-8") 看看是多长.
问题已经解决,谢谢大家。 如果将一张1M的jpg序列化,再把byte数组作为参数传递,就会有问题,webservice只会取前2000多个元素。。。
Inhibitory 2013-12-19
  • 打赏
  • 举报
回复
千年不变的乱码问题,几句话说不清楚,网上关于编码的文章很多,静下心来好好看看。
guishuanglin 2013-12-19
  • 打赏
  • 举报
回复
你就这么点数据 webservice 完全没问题,我用webservice送过 30万行xml,约有50M大完全没问题. 主要是在编码转换问题上: byte[] bytes = new byte[] { 50, 0, -1, 28, -24 }; 你才5个字节,如果有汉字会出错的, utf-8是三字节一个汉字,不信用你汉字转一下: "汉".getBytes("utf-8") 看看是多长.
xiaanming 2013-12-19
  • 打赏
  • 举报
回复
你读取图片用的是什么编码,如果没有设置的话就是系统默认的 楼主顺便帮我戳一下http://vote.blog.csdn.net/blogstaritem/blogstar2013/xiaanming
oh_Maxy 2013-12-16
  • 打赏
  • 举报
回复
引用 6 楼 zhuyouyong 的回复:
[quote=引用 5 楼 oh_Maxy 的回复:] webservice服务端提供的方法签名是什么样子的?感觉byte[]类型应该不会有传输问题的。
byte[] 类型传递的时候,在byte[]长度过长时会导致数据丢失,我的问题和这个帖子是一样一样的。 http://bbs.csdn.net/topics/390200842[/quote] 好吧,那个帖子2L 4L讲的也不错,Base64,你的问题解决了吗?
zhuyouyong 2013-12-16
  • 打赏
  • 举报
回复
引用 5 楼 oh_Maxy 的回复:
webservice服务端提供的方法签名是什么样子的?感觉byte[]类型应该不会有传输问题的。
byte[] 类型传递的时候,在byte[]长度过长时会导致数据丢失,我的问题和这个帖子是一样一样的。 http://bbs.csdn.net/topics/390200842
oh_Maxy 2013-12-16
  • 打赏
  • 举报
回复
引用 4 楼 zhuyouyong 的回复:
[quote=引用 2 楼 oh_Maxy 的回复:] { 50, 0, -1, 28, -24 }; 是怎么得来的?
byte数组是读取一张图片生成的,此处只是一个举例说明。想把这个byte[] 作为参数传递到一个webservice接口中,直接传出现问题,所以想转换成String来传。[/quote] webservice服务端提供的方法签名是什么样子的?感觉byte[]类型应该不会有传输问题的。
zhuyouyong 2013-12-16
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:
{ 50, 0, -1, 28, -24 }; 是怎么得来的?
byte数组是读取一张图片生成的,此处只是一个举例说明。想把这个byte[] 作为参数传递到一个webservice接口中,直接传出现问题,所以想转换成String来传。
jdgdf566 2013-12-16
  • 打赏
  • 举报
回复
使用序列化可以么,转换为字符串肯定是不合适的。
oh_Maxy 2013-12-16
  • 打赏
  • 举报
回复
{ 50, 0, -1, 28, -24 }; 是怎么得来的?
msj100ff 2013-12-16
  • 打赏
  • 举报
回复
为什么不直接传字节数组,还要转成string? 而且,你那个字节数组是utf8编码后的字节码吗? 不是的话转成string当然是乱码
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,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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