2013-11-01 3 views
1

Интересно, может ли кто-нибудь помочь, у меня возникли трудности с отправкой символов UTF-8 в SagePay. База данных представляет собой MySQL с базой данных charset utf8 и Database collation utf8_general_ci. Строка подключения базы данных использует useUnicode = true & characterEncoding = UTF-8, а страница jsp правильно закодирована как <% @ page pageEncoding = "UTF-8" contentType = "text/html; charset = UTF-8"%>Ошибка кодирования Java UTF-8

Все данные, размещенные в базе данных хранится в UTF-8, все данные запрошенные представлен как UTF-8, но когда строка кодируется следующим образом:

crypt = Base64Coder.encodeString(encXor(strPost)); 

, а затем отправил в SagePay, они получают искаженную строку с точки зрения того, где обнаруживается международный характер. Если в строке нет международных символов, сообщение в SapePay будет успешным.

Мои вопросы, если запрашиваемые данные - это UTF-8, почему шифрование или кодирование перед публикацией не UTF-8, а также как я могу заставить кодировку UTF-8 или возможную силу ISO-8859-1 отправлять в SagePay, Конечно, я предпочел бы сохранить UTF-8, но изо всех сил пытался найти решение.

Функция Xor выглядит следующим образом:

public static String encXor(String s) 
{ 
    String s1 = "password"; 
    String s2 = null; 
    byte abyte0[] = s.getBytes(); 
    byte abyte1[] = s1.getBytes(); 
    int i = 0; 
    int j = abyte1.length; 
    ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(abyte0.length); 
    for(int k = 0; k < abyte0.length; k++) 
    { 
     byte byte0 = abyte0[k]; 
     byte byte1 = abyte1[i]; 
     byte byte2 = (byte)(byte0^byte1); 
     if(i < j - 1) 
      i++; 
     else 
      i = 0; 
     bytearrayoutputstream.write(byte2); 
    } 

    try 
    { 
     bytearrayoutputstream.flush(); 
     s2 = bytearrayoutputstream.toString(); 
     bytearrayoutputstream.close(); 
     bytearrayoutputstream = null; 
    } 
    catch(IOException ioexception) { } 
    return s2; 
} 

Любая помощь будет высоко ценится :-)

ответ

1

Я обнаружил проблему, она не касалась кода, а фактически некоторые параметры запуска. Использование Tomcat7w.exe я заметил на вкладке Java, следующие строки:

-Dfile.encoding=UTF-8 
-Dsun.jnu.encoding=UTF-8 

Я удалил эти строки, перезапустить службу Tomcat и все работало, поэтому не требовалось кода изменения.

Спасибо всем, что откликнулись :-)

4

Когда вы делаете

byte abyte0[] = s.getBytes(); 
byte abyte1[] = s1.getBytes(); 

вы используете платформу Java кодирования, что может не UTF-8. И что еще хуже, это может быть разным между вашим клиентом и сервером.

Попробуйте указать кодировку в явном виде:

byte abyte0[] = s.getBytes(StandardCharsets.UTF_8); 
byte abyte1[] = s1.getBytes(StandardCharsets.UTF_8); 

То же самое относится, при преобразовании обратно из байтов в строку.

+0

Спасибо, я попытался это, но при компиляции класса я получаю ошибку незарегистрированного исключения java.io.UnsuportedEncodingException должно быть поймано или объявленным быть выброшено. – iggyweb

+0

Просмотреть последнюю версию под редакцией @artbristol. – Henry

+0

@iggyweb: вам нужно поймать исключение; он никогда не будет выброшен, если у вас нет опечатки в вашем коде. –

Смежные вопросы