java

位置:IT落伍者 >> java >> 浏览文章

Java进阶:在Java中将数据由UTF8转换成GB2312格式


发布日期:2019年11月06日
 
Java进阶:在Java中将数据由UTF8转换成GB2312格式

UTF转换成GB 当我们在基于HTTP协议的JSP或Servlet的应用中获取数据或发送请求时JVM会把输送的数据编码成UTF格式如果我们直接从HTTP流中提取中文数据提取的结果为????(可能更多问号)为转换成我们能够理解的中文字符我们需要把UTF转换成GB借助ISO标准编码能够轻易的实现下面的代码实现了这一功能

byte [] b;

String utf_value;

utf_value = requestgetParameter(NAME);//从HTTP流中取NAME的UTF数据

b = utf_valuegetBytes(_); //中间用ISO过渡

String name = new String(b GB); //转换成GB字符

在知道流长度的情况下将输入流转换成字节数组 Java中的输入流抽象类InputStream有int read(byte[] b int off int len)方法参数中byte[] b是用来存放从InputStream中读取的数据int off指定数组b的偏移地址也就是数组b的起始下标int len指定需要读取的长度方法返回实际读取的字节数

刚学Java的朋友可能要说先定义一个与流长度等长的字节数组调用read方法指定起始下标为指定读取长度与数组长度等长不是一下子可以读出来了吗?说的没错笔者曾经也试着这样读取数据但后来发现在读取网络数据时很不安全我们想想在网络上获取数据可能并没那么流畅数据流的传送可能会断断续续所以并不能保证一次就能读取全部数据特别是在读取大容量数据时更是如此

ServletInputStream inStream = requestgetInputStream(); //取HTTP请求流

int size = requestgetContentLength(); //取HTTP请求流长度

byte[] buffer = new byte[size]; //用于缓存每次读取的数据

byte[] in_b = new byte[size]; //用于存放结果的数组

int count = ;

int rbyte = ;

while (count < size) {

//循环读取

rbyte = inStreamread(buffer); //每次实际读取长度存于rbyte中

for(int i=;iin_b[count + i] = buffer[i];

}

count += rbyte;

}

在不知道流长度的情况下将输入流转换成字节数组 前面介绍了已知流长度的情况下的转换方法那么当我们不知道流有多长时也就是说不能确定转换后的字节数组有多大时该怎么处理呢?笔者查看了JDK文档之后发现ByteArrayOutputStream有一个byte[] toByteArray()方法该方法会自动创建一个字节数组然后返回于是就巧妙的用ByteArrayOutputStream来作中间过渡实现转换其它处理跟上面所介绍已知长度的情况差不多假设需要被转换的流已经放在inStream里了我们可以用如下的代码实现这一功能

ByteArrayOutputStream swapStream = new ByteArrayOutputStream();

byte[] buff = new byte[]; //buff用于存放循环读取的临时数据

int rc = ;

while ((rc = inStreamread(buff )) > ) {

swapStreamwrite(buff rc);

}

byte[] in_b = swapStreamtoByteArray(); //in_b为转换之后的结果

               

上一篇:Java编程那些事儿9——网络编程基础[2]

下一篇:Java技术进阶 基于Java的IDEA加密算法探讨