国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

在Java中將數(shù)據(jù)由UTF8轉(zhuǎn)換成GB2312格式

2019-11-17 04:33:27
字體:
供稿:網(wǎng)友

UTF8轉(zhuǎn)換成GB2312 當(dāng)我們?cè)诨贖TTP協(xié)議的jsp或Servlet的應(yīng)用中獲取數(shù)據(jù)或發(fā)送請(qǐng)求時(shí),JVM會(huì)把輸送的數(shù)據(jù)編碼成UTF8格式。如果我們直接從HTTP流中提取中文數(shù)據(jù),提取的結(jié)果為“????”(可能更多問號(hào)),為轉(zhuǎn)換成我們能夠理解的中文字符,我們需要把UTF8轉(zhuǎn)換成GB2312,借助ISO-8859-1標(biāo)準(zhǔn)編碼能夠輕易的實(shí)現(xiàn),下面的代碼實(shí)現(xiàn)了這一功能:

byte [] b;

String utf8_value;

utf8_value = request.getParameter("NAME");//從HTTP流中取"NAME"的UTF8數(shù)據(jù)

b = utf8_value.getBytes("8859_1"); //中間用ISO-8859-1過渡

String name = new String(b, "GB2312"); //轉(zhuǎn)換成GB2312字符

在知道流長(zhǎng)度的情況下將輸入流轉(zhuǎn)換成字節(jié)數(shù)組 java中的輸入流抽象類InputStream有int read(byte[] b, int off, int len)方法,參數(shù)中byte[] b是用來存放從InputStream中讀取的數(shù)據(jù),int off指定數(shù)組b的偏移地址,也就是數(shù)組b的起始下標(biāo),int len指定需要讀取的長(zhǎng)度,方法返回實(shí)際讀取的字節(jié)數(shù)。

剛學(xué)Java的朋友可能要說:先定義一個(gè)與流長(zhǎng)度等長(zhǎng)的字節(jié)數(shù)組,調(diào)用read方法,指定起始下標(biāo)為0,指定讀取長(zhǎng)度與數(shù)組長(zhǎng)度等長(zhǎng),不是一下子可以讀出來了嗎?說的沒錯(cuò),筆者曾經(jīng)也試著這樣讀取數(shù)據(jù),但后來發(fā)現(xiàn)在讀取網(wǎng)絡(luò)數(shù)據(jù)時(shí)很不安全,我們想想在網(wǎng)絡(luò)上獲取數(shù)據(jù)可能并沒那么流暢,數(shù)據(jù)流的傳送可能會(huì)斷斷續(xù)續(xù),所以并不能保證一次就能讀取全部數(shù)據(jù),特別是在讀取大容量數(shù)據(jù)時(shí)更是如此,所以我們必須在讀取數(shù)據(jù)時(shí)檢測(cè)實(shí)際讀降某ざ齲綣揮卸鐐暌閻ざ鵲氖菥陀Ω迷俅味寥。源搜芳觳猓鋇絞導(dǎo)識(shí)寥〉某ざ壤奐佑胍閻某ざ認(rèn)嗟齲旅嫻拇朧迪至蘇庖還δ埽?

ServletInputStream inStream = request.getInputStream(); //取HTTP請(qǐng)求流

int size = request.getContentLength(); //取HTTP請(qǐng)求流長(zhǎng)度

byte[] buffer = new byte[size]; //用于緩存每次讀取的數(shù)據(jù)

byte[] in_b = new byte[size]; //用于存放結(jié)果的數(shù)組

int count = 0;

int rbyte = 0;

while (count < size) {

 //循環(huán)讀取

 rbyte = inStream.read(buffer); //每次實(shí)際讀取長(zhǎng)度存于rbyte中

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

 }

 count += rbyte;

}

在不知道流長(zhǎng)度的情況下將輸入流轉(zhuǎn)換成字節(jié)數(shù)組 前面介紹了已知流長(zhǎng)度的情況下的轉(zhuǎn)換方法,那么當(dāng)我們不知道流有多長(zhǎng)時(shí),也就是說不能確定轉(zhuǎn)換后的字節(jié)數(shù)組有多大時(shí),該怎么處理呢?筆者查看了JDK文檔之后發(fā)現(xiàn)ByteArrayOutputStream有一個(gè)byte[] toByteArray()方法,該方法會(huì)自動(dòng)創(chuàng)建一個(gè)字節(jié)數(shù)組,然后返回。于是就巧妙的用ByteArrayOutputStream來作中間過渡實(shí)現(xiàn)轉(zhuǎn)換,其它處理跟上面所介紹已知長(zhǎng)度的情況差不多。假設(shè)需要被轉(zhuǎn)換的流已經(jīng)放在inStream里了,我們可以用如下的代碼實(shí)現(xiàn)這一功能:

ByteArrayOutputStream swapStream = new ByteArrayOutputStream();

byte[] buff = new byte[100]; //buff用于存放循環(huán)讀取的臨時(shí)數(shù)據(jù)

int rc = 0;

while ((rc = inStream.read(buff, 0, 100)) > 0) {

 swapStream.write(buff, 0, rc);

}

byte[] in_b = swapStream.toByteArray(); //in_b為轉(zhuǎn)換之后的結(jié)果


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 北辰区| 睢宁县| 临沭县| 托里县| 栾城县| 临泽县| 青田县| 湖南省| 尉氏县| 进贤县| 广德县| 怀化市| 吉木萨尔县| 个旧市| 织金县| 垫江县| 寻乌县| 商河县| 昌乐县| 镇江市| 隆回县| 改则县| 漾濞| 原平市| 抚顺县| 临安市| 密云县| 界首市| 莱芜市| 金山区| 霍邱县| 巴青县| 弋阳县| 宜君县| 花莲市| 富锦市| 平邑县| 浦江县| 环江| 固安县| 南开区|