整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java Jsp中文乱码解决方法

从接触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乐趣。

equests是一个较为简单易用的HTTP请求库,是python中编写爬虫程序最基础常用的一个库。对于初学者来说采集的数据【中文乱码】问题是很烦恼的。

本文将根据实践经验说明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-h6 文本标题, 特点: 独占一行, 自带上下间距, 字体加粗
  • p 段落标签, 特点: 独占一行,自带上下间距
  • hr 水平分割线
  • br 换行
  • b 加粗
  • i 斜体
  • u 下划线
  • s 删除线
  • sub 下标
  • sup 上标
<!--特点: 字体加粗 独占一行 自带上下间距-->
<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 组合 unordered list list item 列表项
  • 有序列表: ol和li 组合 ordered list
  • 列表嵌套: 有序列表和无序列表可以任意无限嵌套 .
<!--无序列表-->
<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图片标签

  • src: 资源路径

1)相对路径: 访问站内资源

图片和页面在同级目录: 直接写图片名

图片在页面的上级目录: ../图片名

图片在页面的下级目录: 文件夹名/图片名

2)绝对路径: 访问站外资源, 图片盗链, 有找不到图片的风险

  • alt: 图片不能正常显示时显示的文本
  • title: 图片标题
  • width/height: 设置宽高 , 只设置宽度时高度会自动等比例缩放

①像素

②上级元素百分比

<!--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

  • href: 资源路径, 作用类似图片标签的src
  • a标签包裹文本为文本超链接, 包裹图片为图片超链接
  • 页面内部跳转, 在目的地的元素里面添加id=xxx 然后在超链接里面添加href="#xxx"
<!--超链接-->
<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 tr表示行 td表示列 th表头 caption标题
  • 相关属性: border边框 colspan跨列 rowspan跨行
<!--表格一 -->
<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表单主要学习的就是下面这些控件
<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分区标签

  • 作用: 可以理解为是一个容器,将多个有相关性的标签进行统一管理
  • 块级分区标签div: 特点是独占一行
  • 行内分区标签span: 特点是共占一行
  • 页面区域如何划分? 至少分为三大区(头,体,脚) 每个大的区域再划分n个小的区域
  • HTML5的标准中新增了一些语义更强的分区标签,为了提高代码的可读性. 这几个标签的作用和div一样都是块级分区标签
  1. header
  2. footer
  3. main主体
  4. section区域
  5. nav 导航

CSS 层叠样式表Cascading Style Sheet)

作用: 美化页面(好比装修)

如何在HTML页面中添加CSS样式代码三种引入方式:

  • 内联样式: 在标签的style属性中添加样式代码, 弊端:不能复用
  • 内部样式: 在head标签里面添加一个style标签, 在标签体内写样式代码, 可以实现复用但是只能在本页面复用
  • 外部样式: 在单独的css样式文件中写样式代码, 在html页面中通过link标签引入, 可以实现多页面复用, 可以将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>

选择器

  1. 标签名选择器: 选取页面中所有同名标签 格式: 标签名{样式代码}
  2. id选择器: 当需要选择页面中某一个元素时使用 格式: #id{样式代码}
  3. 类选择器: 当需要选择多个不相关的元素时,给多个元素添加相同的class属性,然后通过类选择器进行选择 格式: .class{样式代码}
  4. 分组选择器: 分组选择器可以将多个选择器合并成一个 h4,#id,.class{样式代码}
  5. 属性选择器: 通过元素的属性选择元素 格式: 标签名[属性名="属性值"]{样式代码}
  6. 任意元素选择器: 选择页面中所有标签 格式: *{样式代码}
<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快捷键

  • Alt+Insert 生成代码(如get,set方法,构造函数等) 或者右键(Generate)
  • fori/sout/psvm + Tab 【Tab快捷,下:】
  1. iter 快速生成 for…in 语句
  2. inst 快速生成”if instanceof ”语句
  3. itco 快速生成 iterator 的 for 循环
  4. itit 快速生成 iterator 的 while 循环
  5. itli 快速生成 list 的 for(i)循环
  6. psf 快速生成“public static final” 语句
  7. thr 快速生成“throw new” 语句
  • CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
  • ALT+/ 代码提示
  • Ctrl+X 删除行
  • Ctrl+D 复制行
  • Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/…/ )
  • Alt+F1 查找代码所在位置
  • CTRL+Z 倒退(撤销)
  • ALT+F1 查找文件所在目录位置
  • Alt+Shift+F9,选择 Debug
  • Alt+Shift+F10,选择 Run
  • Alt+F9,运行至断点处
  • Alt+F10,定位到断点
  • Shift+F6,重命名
  • Alt+F12 打开命令终端
  • Shift+Shift 搜索文件

学习记录,如有侵权请联系删除。