從接觸Java和JSP以來,就不斷與Java的中文亂碼問題打交道,現在終于得到了徹底的解決,現將我們的解決心得與大家共享。
一、Java中文問題的由來
Java的內核和class文件是基于unicode的,這使Java程序具有良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。原因主要有兩方面,Java和JSP文件本身編譯時產生的亂碼問題和Java程序于其他媒介交互產生的亂碼問題。
首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字節流的,如果Java和JSP編譯成class文件過程中,使用的編碼方式與源文件的編碼不一致,就會出現亂碼。
基于這種亂碼,建議在Java文件中盡量不要寫中文(注釋部分不參與編譯,寫中文沒關系),如果必須寫的話,盡量手動帶參數-ecoding GBK或-ecoding gb2312編譯;對于JSP,在文件頭加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解決這類亂碼問題。
本文要重點討論的是第二類亂碼,即Java程序與其他存儲媒介交互時產生的亂碼。
很多存儲媒介,如數據庫,文件,流等的存儲方式都是基于字節流的,Java程序與這些媒介交互時就會發生字符(char)與字節(byte)之間的轉換,例如從頁面提交表單中提交的數據在Java程序里顯示亂碼等情況。
如果在以上轉換過程中使用的編碼方式與字節原有的編碼不一致,很可能就會出現亂碼。
二、解決方法
對于流行的Tomcat來說,有以下兩種解決方法:
1) 更改 D:\Tomcat\conf\server.xml,指定瀏覽器的編碼格式為“簡體中文”:
方法是找到 server.xml 中的
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />
西安尚學堂 http://www.xasxt.com/
Java零基礎就業班
上課地址:陜西省西安市高新區科技二路西安軟件園天澤大廈五樓
咨詢電話:029-62258374 QQ 2145598324
招生對象:
1. 零計算機編程基礎學
2. 對行業不滿意人士
3. 跨專業編程愛好者
4. 在校大學生實訓
Java零基礎班,10年 Java 以上開發經驗技術講師、架構師、行業大牛,親自純面授課程,手把手教你寫編程。
10月新班免費試聽課程已就緒,7天免費聽課,體驗Java樂趣。
本文將根據實踐經驗說明python中使用requests庫編寫爬蟲程序時,出現【中文亂碼】的原因及解決辦法。
首先,本文的【中文亂碼】情況,指的是原網頁中的中文內容在使用requests獲取后,中文完全無法識別的情況,區別于\x、\u等編碼情況。如下圖中的例子:
導致上圖中【中文亂碼】的原因:
使用requests庫時,選擇使用的文本響應方法不合適,且沒有在代碼中添加設置合適的編碼,以致于使用【response.text】自動獲取到的網頁編碼,與實際網頁的編碼不一致,進而產生【中文亂碼】。
使用requests庫時,可能已經形成了一個習慣,常用【response.text】進行文本響應,而【response.content】常用于圖片、視頻等。
這兩者,最大的一個區別就是:
1、【response.text】會自動根據HTTP頭部去推測網頁的編碼,解碼并返回解碼后的文本。
2、【response.content】不會解碼,直接以二進制形式返回。
兩種文本響應方法,如下表:
response.text | 服務器響應的內容,會自動根據響應頭部的字符編碼進行解碼。根據HTTP頭部對響應的編碼做出有根據的推測,推測文本編碼。返回類型:str;常用于:響應文本 |
response.content | 字節方式的響應體,不會根據HTTP頭部對響應的編碼做出有根據的推測。返回類型:bytes(二進制);常用于:圖片、視頻 |
最有效的解決方法:
使用response的encoding、apparent_encoding,得到網頁編碼。
encoding、apparent_encoding兩者最大的區別:
encoding是從header中去提取,而apparent_encoding是從網頁源碼去解析,apparent_encoding得到的結果更準確。
詳細如下表:
response.encoding | 從網頁響應的header中,提取charset字段中的編碼。若header中沒有charset字段,則默認為ISO-8859-1編碼模式,ISO-8859-1編碼無法解析中文,這也是中文亂碼的原因。 |
response.apparent_encoding | 從網頁的內容中(html源碼)中分析網頁編碼的方式。所以apparent_encoding比encoding更加準確,獲取到的才是原網頁的實際編碼。 |
print(response.apparent_encoding)
print(response.encoding)
使用encoding、apparent_encoding兩種方法,所得的結果是不一致的,apparent_encoding才是原網頁實際編碼。如下圖
根據上述方法,獲得原網頁的實際編碼后,手動在代碼中指定文本編碼格式,即可解決【中文亂碼】問題。如下圖:
response.encoding=response.apparent_encoding
以上就是使用requests爬蟲解決中文亂碼的方法,如那位老師有更好的方法還望賜教,謝謝!
TML 超文本標記語言(英語:HyperText Markup Language)是一種用于創建網頁的標準標記語言。
【注】對于中文網頁需要使用 <meta charset="utf-8"> 聲明編碼,否則會出現亂碼。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>頭條</title>
</head>
<body>
<h1>標題1</h1>
<p>段落1</p>
</body>
</html>
//實例解析
/**DOCTYPE 聲明了文檔類型
位于標簽 <html> 與 </html> 描述了文檔類型
位于標簽 <body> 與 </body> 為可視化網頁內容
位于標簽 <h1> 與 </h1> 作為一個標題使用
位于標簽 <p> 與 </p> 作為一個段落顯示 **/
html在瀏覽器顯示內容區
HTML 文本相關標簽
<!--特點: 字體加粗 獨占一行 自帶上下間距-->
<h1 align="center">內容標題1</h1>
<h2 align="right">內容標題2</h2>
<h3>內容標題3</h3>
<h4>內容標題4</h4>
<h5>內容標題5</h5>
<h6>內容<br>標題6</h6>
<hr>
<!--段落標簽p 特點: 獨占一行 自帶上下間距-->
<p>段落1</p>
<p>段落2</p><p>段落3</p>
加粗<b>標簽</b>
斜體<i>標簽</i>
下劃線<u>標簽</u>
刪除線<s>標簽</s>
<sub> 下標</sub>
<sup> 上標</sup>
HTML 列表標簽
<!--無序列表-->
<ul>
<li>貂蟬</li>
<li>孫尚香</li>
<li>孫悟空</li>
<li>豬八戒</li>
<li>劉禪</li>
</ul>
<!--無序、有序列表-->
<ul>
<li>涼菜
<ol>
<li>拍黃瓜</li>
<li>涼皮</li>
</ol>
</li>
<li>炒菜
<ol>
<li>宮保雞丁</li>
<li>辣椒小炒肉</li>
</ol>
</li>
</ul>
HTML圖片標簽
1)相對路徑: 訪問站內資源
圖片和頁面在同級目錄: 直接寫圖片名
圖片在頁面的上級目錄: ../圖片名
圖片在頁面的下級目錄: 文件夾名/圖片名
2)絕對路徑: 訪問站外資源, 圖片盜鏈, 有找不到圖片的風險
①像素
②上級元素百分比
<!--alt: 當圖片不能正常顯示時 顯示的文本-->
<!--title: 圖片標題-->
<img src="aa.jpg" alt="這是個美女圖片">
<img src="../b.jpg" title="這是標題" alt="">
<!--width/height-->
兩種賦值方式: 1. 像素 2. 上級元素的百分比
只設置寬度時 高度會自動等比例縮放-->
<img src="abc/c.jpg" width="50" alt="">
<img src="abc/c.jpg" width="50%" alt="">
<img src="https://www.baidu.com/e47f5058f84a655.png" alt="">
HTML超鏈接a
<!--超鏈接-->
<a id="top" href="http://www.baidu.com">超鏈接1</a>
<a href="day01.html">超鏈接2</a>
<a href="a.jpg">超鏈接3</a>
<a href="http://www.celinf.cn"><img src="a.jpg" width="100"></a>
<a href="#top">回到頂部</a>
HTML表格table
<!--表格一 -->
<table border="1">
<tr>
<td colspan="2">1-1</td><td rowspan="2">1-3</td>
</tr>
<tr>
<td rowspan="2">2-1</td><td>2-2</td>
</tr>
<tr>
<td colspan="2">3-2</td>
</tr>
</table>
<!--表格二 -->
<table border="1">
<caption>購物車</caption>
<tr>
<th>編號</th><th>商品名</th><th>價格</th>
</tr>
<tr>
<td>1</td><td>小米12 pro</td><td>5000</td>
</tr>
<tr>
<td>2</td><td>華為電視</td><td>4000</td>
</tr>
<tr>
<td>總價:</td><td colspan="2">9000元</td>
</tr>
</table>
HTML表單form
<form action="http://www.baidu.com" method="get">
<!--maxlength最大字符長度 value設置默認值 readonly只讀-->
用戶名:<input type="text" name="username" maxlength="5" value="abc" readonly ><br>
密碼:<input type="password" name="password"><br>
<!--value是單選框必須添加的屬性 否則提交on checked默認選中-->
性別:<input type="radio" name="gender" value="m" id="r1">
<label for="r1">男</label>
<input type="radio" name="gender" checked value="w">女<br>
<!--多選框-->
興趣愛好:<input type="checkbox" name="hobby" value="cy">成員
<input type="checkbox" name="hobby" checked value="hj">環境
<input type="checkbox" name="hobby" value="tt">團體<br>
<!--日期-->
生日:<input type="date" name="birthday"><br>
<!--文件-->
文件:<input type="file" name="pic"><br>
所在地:
<!--value設置提交的內容 selected默認選中-->
<select name="city">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="gz" selected>廣州</option>
</select><br>
<input type="submit" value="注冊">
</form>
HTML分區標簽
CSS 層疊樣式表(Cascading Style Sheet)
作用: 美化頁面(好比裝修)
如何在HTML頁面中添加CSS樣式代碼三種引入方式:
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--內部樣式-->
<style>
h2{color: blue}
</style>
<!--引入外部的css樣式文件-->
<link rel="stylesheet" href="my.css">
</head>
<body>
<h1 style="color: red">內聯樣式1</h1>
<h1 style="color: red">內聯樣式2</h1>
<h2>內部樣式1</h2>
<h2>內部樣式2</h2>
<h3>外部樣式1</h3>
<h3>外部樣式2</h3>
選擇器
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
/*id選擇器*/
#p1{color: red}
/*類選擇器*/
.c1{color: yellow}
/*分組選擇器*/
h4,#p1,.c1{background-color: blue}
/*屬性選擇器*/
input[type="text"]{color: red}
/*任意元素選擇器*/
/*邊框: 粗細 樣式 顏色*/
*{border: 1px solid purple}
</style>
</head>
<body>
<input type="text">
<input type="password">
<p id="p1">蘋果</p>
<p class="c1">香蕉</p>
<p>橘子</p>
<h3>冰箱</h3>
<h3 class="c1">洗衣機</h3>
<h3>電視機</h3>
<h4>張三</h4>
Idea快捷鍵
學習記錄,如有侵權請聯系刪除。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。