java网络流传输,中文乱码问题。
最近需要從某個(gè)網(wǎng)頁上抓取數(shù)據(jù)。一波三折。
1. 先要找到網(wǎng)站頁面調(diào)用后臺(tái)數(shù)據(jù)服務(wù)的url地址,但是本人對(duì)js不了解,花了不少時(shí)間在分析其網(wǎng)頁源代碼的js部分,試圖尋找出調(diào)用數(shù)據(jù)的鏈接。
后來得知瀏覽器都會(huì)追蹤頁面發(fā)出去的所有鏈接,chrome中,“F12->網(wǎng)絡(luò)” 會(huì)顯示所有的調(diào)用鏈接。讀取后端數(shù)據(jù)的鏈接就在里面。
2. 找到url鏈接之后,接下來讀取數(shù)據(jù)。
?開始時(shí)用的是HttpGet類來讀取,代碼如下:
HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = null; try {response = httpClient.execute(httpGet);HttpEntity entity = response.getEntity();body = EntityUtils.toString(entity); } catch (IOException e) {e.printStackTrace(); }return body
但是在body中,總是會(huì)有亂碼的出現(xiàn),如在頁面上顯示的“凱”在程序中顯示為亂碼。在頁面上請(qǐng)求頭和響應(yīng)頭的內(nèi)容,發(fā)現(xiàn)返回的字符集是“gb2312”,于是把代碼改為
body = EntityUtils.toString(entity,“gb2312”);但是仍然顯示為亂碼。
于是在網(wǎng)上(http://www.qqxiuzi.cn/bianma/zifuji.php)查詢“凱”等亂碼的字符集,發(fā)現(xiàn)“GBK”包含這些,而“GB2312”并不包含這些比較少見的字。看來是網(wǎng)頁上的字符集信息不太對(duì)。
接著把代碼修改為
body = EntityUtils.toString(entity,“gbk”);還是有問題。。。
接著嘗試在http頭中加入“charset=gbk”,沒有變化,服務(wù)端不支持。。。
3. 改為從網(wǎng)頁讀取字節(jié)流數(shù)據(jù)
上一步改完代碼后仍然有問題,猜測(cè)是EntityUtils內(nèi)部已經(jīng)做好了轉(zhuǎn)換。但是不知道怎么更進(jìn)一步,所以打算從源頭開始,接收字節(jié)流數(shù)據(jù)。
代碼如下:
URL quest = new URL(url); HttpURLConnection Connection = (HttpURLConnection).quest.openConnection(); InputStream is = Connection.getInputStream(); int len = 0; byte[] temp = new byte[102400]; int llen = -1; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); while ((llen = is.read(temp, 0, 102400)) != -1) {outStream.write(temp, 0, llen); } is.close(); content = new String(outStream.toByteArray(),"gbk");用ByteArrayOutputStream接收byte數(shù)據(jù),是為了防止中間被截?cái)鄬?dǎo)致最后翻譯目標(biāo)字符集的時(shí)候出現(xiàn)錯(cuò)誤。
這么使用的前提是要知道數(shù)據(jù)的字符集編碼。
?
從結(jié)果往回看是一個(gè)簡(jiǎn)單的方法,但是之中的每一步都花費(fèi)了不少精力才找到正確的方向,debug是個(gè)苦力活~~~
綜上,看來最有效的方法是接收字節(jié)流,自己轉(zhuǎn)成相應(yīng)字符集編碼格式。
?
轉(zhuǎn)載于:https://www.cnblogs.com/starRebel/p/5630872.html
總結(jié)
以上是生活随笔為你收集整理的java网络流传输,中文乱码问题。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 一个脚本调用另一个脚本的函数
- 下一篇: 5个强大的Java分布式缓存框架推荐