1

我想知道是否有人可以帮忙,我很难将 UTF-8 字符发布到 SagePay。数据库是 MySQL,具有数据库字符集 utf8 和数据库排序规则 utf8_general_ci。数据库连接字符串使用 useUnicode=true&characterEncoding=UTF-8 并且 jsp 页面正确编码为 <%@page pageEncoding="UTF-8" contentType="text/html; charset=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 但努力寻找解决方案。

异或函数如下:

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

任何帮助将非常感激 :-)

4

2 回答 2

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

当您从字节转换回字符串时,同样适用。

于 2013-11-01T09:13:10.060 回答
1

我发现了这个问题,它与代码无关,但实际上与一些启动参数有关。使用 Tomcat7w.exe 我在 Java 选项卡中注意到以下几行:

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

我删除了这些行,重新启动了 Tomcat 服务,一切正常,因此不需要更改代码。

感谢所有回复的人:-)

于 2013-11-05T09:00:22.423 回答