2013-11-01 45 views
1

我想知道是否有人可以请求帮助,我很难发布UTF-8字符到SagePay。数据库是带有数据库字符集utf8和数据库排序规则utf8_general_ci的MySQL。数据库连接字符串使用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:你需要捕捉异常;除非在代码中存在拼写错误,否则不会抛出它。 –