Неанглийские символы в базе данных с использованием 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);

person Mona Dhar    schedule 12.11.2015    source источник
comment
Почему вы конвертируете его в ISO-8859-1, а затем интерпретируете результаты как UTF-8? Это в значительной степени обязательно пойдет не так (по крайней мере, для любых данных, отличных от ASCII). Почему вы делаете что-либо из этого, а не просто устанавливаете описание транзакции на dataStr?   -  person Jon Skeet    schedule 12.11.2015
comment
IDE также должна использовать UTF-8 для редактора и компилятора javac. А то System.out.println не годится для UTF-8, Выводит в консоль наверное с кодировкой операционной системы. Это преобразует java String (Unicode) в кодировку Windows.   -  person Joop Eggen    schedule 12.11.2015


Ответы (2)


Вы действительно должны попытаться сделать все UTF-8 от точки к точке.

Используйте соответствующую сортировку с поддержкой Unicode для базы данных и таблицы, я всегда даю для каждой таблицы, даже если значение по умолчанию для базы данных уже задано. В этом ответе много проблем с mysql + java, а также проблем с сервлетами, но они должны ответить на большинство проблем, которые нам нужно знать при разработке Java-приложений с поддержкой Unicode.

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"
/>

В начале каждой страницы сервлета убедитесь, что парсеры Tomcat запрашивают параметры как utf-8. Вам нужно вызвать setCharacterEncoding перед чтением параметров, иначе будет слишком поздно. Большинство веб-браузеров не отправляют атрибут charset типа содержимого, поэтому механизмы сервлетов могут неправильно его угадать.

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 и вы не жестко кодируете буквы i18n на странице jsp, вы можете выбрать правильную 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>

Создавая xml-документ на странице jsp, вам нужно написать xml-заголовок без начальных белых символов или новых строк. Посмотрите, как конечный тег скриптлета и заголовок xml находятся в одной строке. Это то, что встроенный код 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>
person Whome    schedule 12.11.2015

Причина, по которой это происходит, - неправильная кодировка в JavaClass. Также я советую вам проверить кодировку вашей базы данных MySQL.

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

Проверьте эти параметры db-serverSide

character_set_results 
character_set_connection
character_set_client 
person flybox    schedule 12.11.2015