1. 程式人生 > >Java 的亂碼解決方法 統一編碼 這裡使用UTF-8編碼

Java 的亂碼解決方法 統一編碼 這裡使用UTF-8編碼

一、介紹兩個類

URLEncoder//編碼

URLDecoder//解碼

看看下面的測試輸出,你就明白是做什麼的了

import java.io.UnsupportedEncodingException;

import java.net.URLDecoder;

import java.net.URLEncoder;

public class main {

 public static void main(String[] args) throws UnsupportedEncodingException{

  System.out.println("UTF-8");

  String a = URLEncoder.encode("中文測試", "UTF-8");//編碼

  System.out.println(a);

  System.out.println(URLDecoder.decode(a,"UTF-8"));//還原

  //下面同理

  System.out.println("\nGBK(百度就是用這種)");

  a = URLEncoder.encode("中文測試", "GBK");

  System.out.println(a);

  System.out.println(URLDecoder.decode(a,"GBK"));

 }

}

[輸出]

UTF-8

%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95

中文測試

GBK(百度就是用這種)

%D6%D0%CE%C4%B2%E2%CA%D4

中文測試

看了上面的輸出就明白百度位址列那一串是什麼了。假如你做了下面一系列設定,那麼在伺服器端你接收到Get方法的中文引數將被轉換成型別%D6%D0%CE%C4%B2%E2%CA%D4 你就需要用到上面的兩個工具類, 如果你像我在下面設定,你在上面的呼叫的第二個引數也得是UTF-8; 使用post就不需要解碼,直接讀取就行了。

二、配置tomcat (這一步我沒有做,但沒發現問題,我用的是Tomcat 5.08經典版本)

開啟tomcat的server.xml檔案,找到區塊,加入如下一行:

URIEncoding="UTF-8"

完整的應如下:

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>

三、增加連線資料庫的引數

mysql 資料庫建表時設定編碼為utf8(寫法不同不是UTF-8),

連線資料庫:

 // 連線引數,這裡設定連線使用的編碼

 public static final String DB_URL = "jdbc:mysql://localhost:3306/?useUnicode=true&characterEncoding=utf8";

四、使用過濾器設定編碼 

1、

// 簡單的就用下面這個,這裡使用的是硬編碼也就是在程式碼中寫死了用那種編碼我這裡用utf-8,也可以把編碼設定用寫到web.xml中的Filter設定中

package com.max;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

/**

* Example filter that sets the character encoding to be used in parsing the

* incoming request

*/

public class SetCharacterEncodingFilter implements Filter {

    /**

     * Take this filter out of service.

     */

    public void destroy() {

    }

    /**

     * Select and set (if specified) the character encoding to be used to

     * interpret request parameters for this request.

     */

    public void doFilter(ServletRequest request, ServletResponse response,

    FilterChain chain)throws IOException, ServletException {

    request.setCharacterEncoding("UTF-8");

    // 傳遞控制到下一個過濾器

    chain.doFilter(request, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {

    }

}

web.xml配置檔案中增加

    <filter>

  <filter-name>Set Character Encoding</filter-name>

  <filter-class>com.max.SetCharacterEncodingFilter</filter-class>

 </filter>

 <filter-mapping>

  <filter-name>Set Character Encoding</filter-name>

  <url-pattern>/*</url-pattern>

 </filter-mapping>

2、

//下面這個是將編碼設定放到web.xml中的

filter類的內容:

/*

 * ====================================================================

 *

 *              JavaWebStudio 開源專案

 *              

 *               Struts_db v0.1

 *

 * ====================================================================

 */

package com.strutsLogin.util;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

/**

 * 中文過濾器

 */

public class SetCharacterEncodingFilter implements Filter {

 // ----------------------------------------------------- Instance Variables

 /**

  * The default character encoding to set for requests that pass through this

  * filter.

  */

 protected String encoding = null;

 /**

  * The filter configuration object we are associated with. If this value is

  * null, this filter instance is not currently configured.

  */

 protected FilterConfig filterConfig = null;

 /**

  * Should a character encoding specified by the client be ignored?

  */

 protected boolean ignore = true;

 // --------------------------------------------------------- Public Methods

 /**

  * Take this filter out of service.

  */

 public void destroy() {

  this.encoding = null;

  this.filterConfig = null;

 }

 /**

  * Select and set (if specified) the character encoding to be used to

  * interpret request parameters for this request.

  *

  * @param request

  *            The servlet request we are processing

  * @param result

  *            The servlet response we are creating

  * @param chain

  *            The filter chain we are processing

  *

  * @exception IOException

  *                if an input/output error occurs

  * @exception ServletException

  *                if a servlet error occurs

  */

 public void doFilter(ServletRequest request, ServletResponse response,

   FilterChain chain) throws IOException, ServletException {

  // Conditionally select and set the character encoding to be used

  if (ignore || (request.getCharacterEncoding() == null)) {

   String encoding = selectEncoding(request);

   if (encoding != null)

    request.setCharacterEncoding(encoding);

  }

  // Pass control on to the next filter

  chain.doFilter(request, response);

 }

 /**

  * Place this filter into service.

  *

  * @param filterConfig

  *            The filter configuration object

  */

 public void init(FilterConfig filterConfig) throws ServletException {

  this.filterConfig = filterConfig;

  this.encoding = filterConfig.getInitParameter("encoding");

  String value = filterConfig.getInitParameter("ignore");

  if (value == null)

   this.ignore = true;

  else if (value.equalsIgnoreCase("true"))

   this.ignore = true;

  else if (value.equalsIgnoreCase("yes"))

   this.ignore = true;

  else

   this.ignore = false;

 }

 // ------------------------------------------------------ Protected Methods

 /**

  * Select an appropriate character encoding to be used, based on the

  * characteristics of the current request and/or filter initialization

  * parameters. If no character encoding should be set, return

  * <code>null</code>.

  * <p>

  * The default implementation unconditionally returns the value configured

  * by the <strong>encoding</strong> initialization parameter for this

  * filter.

  *

  * @param request

  *            The servlet request we are processing

  */

 protected String selectEncoding(ServletRequest request) {

  return (this.encoding);

 }

}// EOC

然後我們在web.xml中加一些配置,就可以了,配置如下:

<filter>

    <filter-name>Set Character Encoding</filter-name>

    <filter-class>javawebstudio.struts_db.SetCharacterEncodingFilter</filter-class>

    <init-param>

        <param-name>encoding</param-name>

        <param-value>UTF-8</param-value>

    </init-param>

    <init-param>

        <param-name>ignore</param-name>

        <param-value>true</param-value>

    </init-param>

</filter>

<filter-mapping>

    <filter-name>Set Character Encoding</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

放在web.xml的合適位置。一般在最後,<jsp-config>標籤之前(如果有的話)

五、在JSP頁面中設定編碼

<%@ page language="java" pageEncoding="UTF-8"%>

六、使用i18n

使ApplicationResources.properties支援中文

建立一個ApplicationResources_ISO.properties檔案,把應用程式用的message都寫進去,然後在dos下執行這個命令,

native2ascii -encoding gb2312 ApplicationResources_ISO.properties ApplicationResources.properties

native2ascii          [引數]  [輸入檔案]                          [輸出檔案]

native2ascii這個工具是jdk自帶的一個東東,所以如果path都設定正確就可以直接運行了,你可以在$java_home$/bin下找到他。

轉換後的中文類似於這個樣子

中文格式下 :user_name_label=使用者名稱:

ascii格式下 :user_name_label=\用\戶\名\:

Netbean 有個方便的編輯多國語言的工具,但不是直接寫,而是在彈出視窗中編輯,確定插入後自動轉換成ascii如上面那種.

Eclipse 有個一樣功能的外掛jinto在下面的地址中下載

在Jsp頁面使用 "user_name_label" 來引用 "使用者名稱:",而且能夠簡單方便實現多語言支援。

通常將編碼同一成UTF-8是很有好處的,如果想使用其他編碼如GBK,這上面用到UTF-8全改為GBK

有些東西接觸多了就瞭解,做的多了就熟悉。

宣告:這篇只是我自己的總結和備忘錄,希望對你有用,上面引用的程式碼和例子主要來源於網上。

相關推薦

php 多語言(UTF-8編碼)導出Excel、CSV亂碼解決辦法之導出UTF-8編碼的Excel、CSV

csv tex 完整 多語 繁體 HP 項目 .html agen 轉自: https://www.cnblogs.com/kclteam/p/5278926.html 新項目,大概情況是這樣的:可能存在多國、不同語種使用者,比喻有中文、繁體中文,韓文、日本等等,開發

Java亂碼解決方法 統一編碼 這裡使用UTF-8編碼

一、介紹兩個類 URLEncoder//編碼 URLDecoder//解碼 看看下面的測試輸出,你就明白是做什麼的了 import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.U

Java亂碼解決方法 統一編碼UTF-8

一、介紹兩個類URLEncoder//編碼URLDecoder//解碼 看看下面的測試輸出,你就明白是做什麼的了 import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import jav

Java亂碼解決方法 統一編碼UTF-8 (轉)

一、介紹兩個類URLEncoder//編碼URLDecoder//解碼看看下面的測試輸出,你就明白是做什麼的了import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.

Html表單提交到Servlet輸出到頁面亂碼 Html使用的編碼UTF-8編碼顯示頁面,之後使用form表單提交欄位到Servlet中,Servlet將利用getParamer方法獲得fo

Html使用的編碼是UTF-8編碼顯示頁面,之後使用form表單提交欄位到Servlet中,Servlet將利用getParamer方法獲得form提交的欄位,之後通過Respone中的writer將獲取到的前臺欄位反饋到前臺中去,出現中午亂碼錯誤,這是因為添加了這個欄位。 response.setCon

JavaJava“字串操作”實際應用——形成GBK編碼UTF-8編碼的文字檔案,通過其二進位制資料觀察兩種編碼的不同

一、任務目標     完成一個java application應用程式,可以把GBK編碼的漢字字串與UTF-8編碼的漢字字串相互轉換。並配合寫檔案操作形成不同編碼格式的文字檔案,可以通過其二進位制資料觀察兩種編碼的不同。   二、程式設計思路     博主將“程式設計思路”以流程

QT5 中文顯示亂碼編碼utf-8編碼

QT5 專案中,中文錯誤有兩種方法,分享如下: 1. 就是用utf-8編碼 在 .cpp 中 最上端新增以上程式碼 #pragma execution_character_set("utf-8") 2.使用巨集 QString str = QStringLit

java中如何從字串中刪選中文字元(GBK編碼UTF-8編碼

1.GBK編碼中文佔兩個位元組,英文佔一個位元組。下面進行一個小的程式的測試: <span style="font-size:24px;">import java.io.Unsupport

Python中的Unicode編碼UTF-8編碼

2個 傳輸 硬盤 中文字符 結合 2.7 客戶端 有一點 來看 下午看廖雪峰的Python2.7教程,看到 字符串和編碼 一節,有一點感受,結合 崔慶才的Python博客 ,把這種感受記錄下來: ASCII碼:是用一個字節(8bit, 0-255)中的127個字母表示大

python中的字符串編碼問題——2.理解ASCII碼、ANSI碼、Unicode編碼UTF-8編碼

unicode編碼 統一 col 簡單 utf 文字 stand 二進制 pan ASCII碼:全名是American Standard Code for Information Interchange,ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,範圍0x0

淺談unicode編碼utf-8編碼的關係

字串編碼在Python裡邊是經常會遇到的問題,特別是寫檔案以及網路傳輸的過程中,當呼叫某些函式的時候經常會遇到一些字串編碼提示錯誤,所以有必要弄清楚這些編碼到底在搞什麼鬼。 我們都知道計算機只能處理數字,文字轉換為數字才能處理。計算機中8個bit作為一個位元組,所以一個位元組能表示最大的數字

關於Unicode編碼UTF-8編碼

        說到編碼,得先從ASCII編碼講起。ASCII編碼是由美國人發明,美國的字元不超過255個,所以ASCII編碼使用了8bit 即一個位元組來儲存字元。由於漢字的數量遠超255個,所以中國自己發明了一個GB2312編碼來表示漢字,一般的漢字使用2個

字元編碼之Ascll編碼,ANSI編碼,Unicode編碼UTF-8編碼 ,BOM

從大一上C語言就開始認識了Ascll編碼,ascll碼也算是我們最早所接觸的編碼 【1】Ascll碼  Ascll碼由三部分組成:           第一部分從00H到1FH共32個,一般用來通訊或作為開工至之用,有的可以顯示在螢幕上,有的則無法再螢幕上顯示。  

C語言實現windows1251編碼utf-8編碼

windows1251是俄羅斯本地的一種編碼,不通用。mini xml好像無法解析,但客戶就是提供一個這種編碼檔案的url,讓你解析裡面的資料。 開源的編碼轉換庫又太大,只好用C語言寫一個。有些字元轉換沒什麼規律,只能一一對應,很耿直的轉換方式,哈哈~~,不過以後如果遇到相

Ansi編碼UTF-8編碼

ANSI指American National Standards Institute(美國國家標準學會)。 ANSI編碼不是一種具體的編碼方式,而是一種指定在某些環境下使用某些編碼方式的標準。比如,在中文環境中ANSI的編碼標準為GBK,在日語環境中ANSI的編

JAVAUTF-8編碼格式匯出CSV檔案,用office開啟產生亂碼解決方法

一般java匯出為csv檔案程式碼如下 OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream

idea軟體編碼已經設定好了為utf-8,但是svn中down下來的檔案格式本身不是utf-8的,此時開啟後會出現中文亂碼解決方法

我是個idea的忠實使用者,新公司的專案都是用eclipse做的,通過svn拉下程式碼後發現,註釋的內容裡,中文內容都是亂碼。問過專案負責人,說可能是GBK編碼。 但是,我通過idea的setting設定了編碼,試了5種編碼都沒用,中文內容還是亂碼。最後還是自己試出來解決方案。 詳細的原因請參考

解決excel打開utf-8編碼csv文件亂碼的bug

導入 對話框 原因 識別 直接 格式 excel exce 編碼 直接用 excel 打開 utf-8 編碼的 csv 文件會導致漢字部分出現亂碼。原因是 excel 以 ansi 格式打開,不會做編碼識別。 打開 utf-8 編碼的 csv 文件的方法: 1) 打開

request.getParameter(“引數名”) 中文亂碼解決方法【新手設定問題】【JSP】-表單傳值問題:為什麼設定UTF-8之後還是亂碼

request.getParameter(“引數名”) 中文亂碼解決方法【新手設定問題】【JSP】-表單傳值問題:為什麼設定UTF-8之後還是亂碼? 問題:jsp讀取的value值亂碼;設定UTF-8之後還是亂碼…… 備註:本文是轉載的,題目上增加關鍵詞方便查詢

emWin - 俄語UTF-8編碼亂碼問題(已解決

原文連結:emWin - 俄語UTF-8編碼亂碼問題(已解決) 目錄 第一步: 第二步: 後續故事: 使用的是STM32微控制器,用的是emWin的庫,編碼工具是U2C(UTF-8 To C檔案)。 最近在搞一個專案,液晶屏要顯示九種語言、種語言、語言、言言言!