从接触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小时内与您取得联系。