---
# System prepended metadata

title: servlet請求出現中文亂碼(編碼設置)
tags: [Java Web-問題以及解決]

---

# servlet請求出現中文亂碼(編碼設置)
###### tags: `Java Web-問題以及解決`

### 輸入中文添加後，在mysql資料庫中，中文會呈現亂碼
添加畫面：
![](https://i.imgur.com/Jdm9orZ.png)
mysql資料庫：
![](https://i.imgur.com/bes1dkr.png)

### 原因：
表單是由此html文件發出，其中執行的method=post，是由AddServlet.java文件發出
```htmlmixed=
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <form action="add" method="post">
      名稱：<input type="text" name="fname"/><br/>
      價格：<input type="text" name="price"/><br/>
      庫存：<input type="text" name="fcount"/><br/>
      備註：<input type="text" name="remark"/><br/>
    <input type="submit" value="添加"/><br/>
  </form>
</body>
</html>
```
AddServlet.java內容
```java=
public class AddServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {

        String fname = request.getParameter("fname");
        String priceStr = request.getParameter("price");
        Integer price = Integer.parseInt(priceStr);
        String fcountStr = request.getParameter("fcount");
        Integer fcount = Integer.parseInt(fcountStr);
        String remark = request.getParameter("remark");

        FruitDAO fruitDao = new FruitDAOImpl();
        boolean flag = fruitDao.addFruit(new Fruit(0,fname,price,fcount,remark));

        System.out.println(flag ? "添加成功" : "添加失敗！");
    }
}
```
透過debug功能找出出現亂碼的原因(使用step over逐步找)
(1)看到fname的位置出現亂碼
![](https://i.imgur.com/5SyqS2J.png)

### 解決方法：在此方式下設置編碼
添加編碼
```java=
request.setCharacterEncoding("UTF-8");
```
完整程式碼：
```java
public class AddServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {


        request.setCharacterEncoding("UTF-8");
        String fname = request.getParameter("fname");
        String priceStr = request.getParameter("price");
        Integer price = Integer.parseInt(priceStr);
        String fcountStr = request.getParameter("fcount");
        Integer fcount = Integer.parseInt(fcountStr);
        String remark = request.getParameter("remark");

        FruitDAO fruitDao = new FruitDAOImpl();
        boolean flag = fruitDao.addFruit(new Fruit(0,fname,price,fcount,remark));

        System.out.println(flag ? "添加成功" : "添加失敗！");
    }
}

```
後台結果：
![](https://i.imgur.com/nDfrOxn.png)

資料庫：
![](https://i.imgur.com/zpCURkr.png)

成功

### 注意事項
    tomcat8之前，設置編碼：
      (1)get請求方式：
        get方式目前不需要設置編碼(基於tomcat8)
        如果是get請求發送的中文數據，轉碼稍微有點麻煩(tomcat8之前)
        String fname = request.getParameter("fname");
             1.將字符串打散成字節數組
                byte[] bytes = fname.getBytes("ISO-8859-1");
             2.將字符數組按照設定的編碼重新組裝成字符串
                fname = new String(bytes,"UTF-8");
    (2)post請求方式：
            request.setCharacterEncoding("UTF-8");
        tomcat8開始，設置編碼，只需要針對post方式
            request.setCharacterEncoding("UTF-8");
    注意：
        需要注意的是，設置編碼這一句代碼必須在所有的獲取參數動作之前