繁体   English   中英

使用 Java 的数据库中的非英文字符

[英]Non english characters in database using Java

我必须使用 Java 代码在 MySql 中保存非英语(特殊字符),当我尝试这样做时,数据被保存为 ??????

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);

您真的应该尝试将所有内容从点到点制作成 UTF-8。

对数据库和表使用适当的 unicode 感知排序规则,即使已经给出了 db default,我也总是给每个表。 这个答案有很多 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 参数字符串使用内容类型字符集,因此对 http 和 https 连接器(tomcat/conf/server.xml 文件)应用 useBodyEncodingForURI 属性。

<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 页面不要插入空的前导白字符,否则调用 setCharacterEncoding 可能为时已晚,请参阅我如何在每行的末尾放置标签标记以避免任何白字符,以及 html 元素如何从第一行开始。 Jsp 标记contentType转到 http 响应,而pageEncoding表示文件如何存储在磁盘中。 如果您只有 ISO-8859-15 文本编辑器并且没有在 jsp 页面中硬编码 i18n 字母,您可以选择正确的 iso* pageEncoding。

<%@ 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>

在jsp页面中创建xml文档你需要编写没有前导whitechars或换行符的xml header。 查看 scriptlet endtag 和 xml header 如何在同一行中。 这是嵌入式 jsp 代码必须始终考虑的问题,无辜的前导白字符可能会破坏格式良好的回复。

<%@ 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>

原因是因为发生这种情况是 JavaClass 中的错误编码。 我还建议您检查您的 MySQL 数据库编码。

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

检查这个 db-serverSide 参数

character_set_results 
character_set_connection
character_set_client 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM