Прочитайте специальные описания (Java) из Java из базы данных Oracle - PullRequest
1 голос
/ 18 июля 2011

У меня проблема при чтении специальных символов из базы данных оракула (используйте драйвер JDBC и tooplink Glassfish).

Я храню в базе данных имя "GRØNLÅEN KJÆTIL" через WebService, и в базе данных данные хранятся правильно.

Но когда я читаю эту строку, распечатываю файл журнала и конвертирую его в байтовый массив с таким кодом:

 int pos = 0;
 byte[] msg=new byte[1024];

 String F = "F" + passenger.getName();
 logger.debug("Add " + F + " " + F.length());
 msg = addStringToArrayBytePlusSeparator(msg, F,pos);

..............

private byte[] addStringToArrayBytePlusSeparator(byte[] arrDest,String strToAdd,int destPosition)
    {
        System.arraycopy(strToAdd.getBytes(Charset.forName("ISO-8859-1")), 0, arrDest, destPosition, strToAdd.getBytes().length);

        arrDest = addSeparator(arrDest,destPosition+strToAdd.getBytes().length,1);

        return arrDest;
    }

1) В файле журнала есть: «Добавить FGRÃNLû (имя неверное, а F.length () не напечатаны).

2) Бросок кода: java.lang.ArrayIndexOutOfBoundsException в java.lang.System.arraycopy (родной метод) at it.edea.ebooking.business.chi.control.VingCardImpl.addStringToArrayBytePlusSeparator (Test.java:225).

Есть решение?

Танки

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Вы звоните strToAdd.getBytes() без указания кодировки символов в вызове System.arraycopy, который будет использовать системную кодировку по умолчанию, которая вполне может не соответствовать ISO-8859-1. Вы должны быть последовательны в том, какую кодировку вы используете. Честно говоря, я бы также предложил вам использовать UTF-8, а не ISO-8859-1, если у вас есть выбор, но это другой вопрос.

Почему вы так или иначе имеете дело с байтовыми массивами? Почему бы просто не использовать строки?

Также обратите внимание, что ваш метод addStringToArrayBytePlusSeparator не дает никаких указаний на то, сколько байт было скопировано, что означает, что вызывающая сторона не будет иметь никакого представления о том, что делать с ним впоследствии. Если вы должны использовать такие байтовые массивы, я бы предложил addStringToArrayBytePlusSeparator вернуть либо новый "конец логического массива", либо количество скопированных байтов. Например:

private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");

/**
 * (Insert fuller description here.)
 * Returns the number of bytes written to the array
 */
private static int addStringToArrayBytePlusSeparator(byte[] arrDest,
                                              String strToAdd,
                                              int destPosition)
{
    byte[] encodedText = ISO_8859_1.getBytes(strToAdd);
    // TODO: Verify that there's enough space in the array 

    System.arraycopy(encodedText, 0, arrDest, destPosition, encodedText.length);

    return encodedText.length;
}
0 голосов
/ 18 июля 2011

Проблемы с кодированием / декодированием сложны. На каждом шаге процесса вы должны делать правильное кодирование / декодирование. Итак,

  1. ознакомьтесь с разницей в байтах (inputtream) и символах (Readers, Strings)
  2. Выберите, в какой кодировке вы хотите хранить свои данные в базе данных, и в какой кодировке вы хотите выставить свой веб-сервис. Убедитесь, что при загрузке исходных данных в базу данных они находятся в правильной кодировке
  3. связаться с нужными свойствами базы данных. mysql требует добавления к URL-адресу соединения: ?useUnicode=true&characterEncoding=UTF-8 при использовании UTF-8, я не знаю о oracle.
  4. если вы печатаете / отлаживаете на определенном этапе, и он выглядит нормально, вы не можете быть уверены, что сделали все правильно. Регистратор может писать с неправильной кодировкой (иногда что-то выглядит нормально, хотя на самом деле оно сломано). Ваш терминал не может правильно обрабатывать странные байтовые кодировки. То же самое относится к клиентам базы данных командной строки. Ваши данные могут быть неправильно сохранены, но неправильно настроенный терминал интерпретирует / показывает данные как правильные.
  5. В XML важна не только потоковая кодировка, но и атрибут xml-encoding.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...