2015-11-12 23 views
1

我必須使用Java代碼在MySql中保存非英文(特殊字符),當我試圖這樣做時數據被保存爲??????數據庫中使用Java的非英文字符

String dataStr = "κωνσταντίνα"; 
      System.out.println("Before " + dataStr); 
      String dataStr1 = new String(dataStr.getBytes("ISO-8859-1"),"UTF-8"); 
      System.out.println("after "+dataStr1); 
      String st = URLDecoder.decode("κωνσταντίνα", "UTF-8"); 
      cd.setTransactionDescription(dataStr1); 
+1

爲什麼要將它轉換爲ISO-8859-1,然後將結果解釋爲UTF-8?這幾乎肯定會出錯(至少對於任何非ASCII數據)。你爲什麼要做這些*任何*,而不是僅僅把事務描述設置爲'dataStr'? –

+0

IDE也必須使用UTF-8編輯器和javac編譯器。然後'System.out.println'不適合UTF-8,它可能輸出到控制檯,可能是操作系統編碼。將Java String(Unicode)轉換爲Windows編碼。 –

回答

0

Reasone因爲發生這種情況在JavaClass中是錯誤的編碼。 另外我建議你檢查你的MySQL數據庫編碼。

[mysqld] 
character-set-server = utf8 
collation-server = utf8_unicode_ci 

檢查該DB-服務器端PARAMS

character_set_results 
character_set_connection 
character_set_client 
1

你真的應該嘗試讓一切UTF-8從點對點。

對數據庫和表使用合適的unicode識別排序規則,即使已經給出db默認值,我也總是給每個表。這個答案有很多mysql + java和servlet問題,但是它們應該回答開發支持unicode的java應用程序時需要知道的大多數問題。

CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci; 

CREATE TABLE tMyTable (
    id int(11) NOT NULL auto_increment, 
    code VARCHAR(20) NOT NULL, 
    name VARCHAR(20) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci; 

使用jdbc連接字符串進行unicode轉換。

<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" 
    maxActive="10" maxIdle="2" maxWait="10000" 
    username="myuid" password="mypwd" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8" 
    validationQuery="SELECT 1" 
/> 

力Tomcat使用內容類型的字符集爲GET和POST參數字符串,所以申請useBodyEncodingForURI屬性用於HTTP和HTTPS連接器(tomcat的/ conf/server.xml文件)。

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

在每個servlet頁面的開始處,確保Tomcat解析器請求參數爲utf-8。您需要在讀取參數之前調用setCharacterEncoding,否則爲時已​​晚。大多數Web瀏覽器不會發送內容類型的字符集屬性,所以servlet引擎可能會猜測它是錯誤的。

public void doGet(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException { doPost(req, res); } 

public void doPost(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException { 
    if (req.getCharacterEncoding() == null) 
     req.setCharacterEncoding("UTF-8"); 

    String value = request.getParameter("fieldName"); 
    ... 
} 

小心的.jsp頁面不插空領先whitechars也可能是太晚了通話的setCharacterEncoding,看我怎麼把標籤標記在每一行的末尾,以避免任何whitechars,還怎麼html元素從第一行開始。 Jsp標記contentType轉到http響應,pageEncoding表示文件如何存儲在磁盤中。如果只有ISO-8859-15文本編輯器,並且不在jsp頁面中硬編碼i18n字母,則可以選擇合適的iso * pageEncoding。在jsp頁面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ 
    taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %><%@ 
    page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" 
    import="java.util.*, 
      java.io.* 
    " 
%><% 
    if (req.getCharacterEncoding() == null) 
     request.setCharacterEncoding("UTF-8"); 
    String param1 = request.getParameter("fieldName"); 
%><!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Page Title</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <meta name="keywords" content="some,fine,keywords" /> 
</head> 
<body> 
your html content goes here.... <%= param1 %> 
</body> 
</html> 

創建XML文檔,你需要編寫XML頭沒有前導whitechars或換行符。查看scriptlet endtag和xml標題在同一行中的方式。這是嵌入式jsp代碼必須經常考慮的事情,無辜的領先whitechar可能會破壞格式化的回覆。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ 
    page contentType="text/xml; charset=UTF-8" pageEncoding="ISO-8859-1" 
    import="java.util.*, 
      java.io.* 
    " 
%><% 
    // MyBean has getId() and getName() getters 
    List<MyBean> items = new ArrayList<MyBean>(); 
    items.add(new MyBean(1, "first")); 
    items.add(new MyBean(2, "second")); 
    items.add(new MyBean(3, "third")); 

    pageContext.setAttribute("items", items); 
%><?xml version="1.0" encoding="UTF-8"?> 
<mydoc> 
<c:forEach var="item" items="${items}"> 
    <item> 
    <id>${item.id}</id> 
    <name>${item.name}</name> 
    </item> 
</c:forEach> 
</mydoc>