【问题标题】:Java UTF-8 Encoding IssueJava UTF-8 编码问题
【发布时间】:2013-11-12 11:18:30
【问题描述】:

我想知道是否有人可以帮忙,我在向 SagePay 发布 UTF-8 字符时遇到了困难。数据库是 MySQL,具有数据库字符集 utf8 和数据库排序规则 utf8_general_ci。数据库连接字符串使用 useUnicode=true&characterEncoding=UTF-8 并且 jsp 页面正确编码为

所有发布到数据库的数据都以 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;
}

任何帮助将不胜感激:-)

【问题讨论】:

    标签: java encoding utf-8 opayo


    【解决方案1】:

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

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

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

    感谢所有回复的人:-)

    【讨论】:

      【解决方案2】:

      当你这样做时

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

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

      【讨论】:

      • 谢谢,我已经尝试过了,但是在编译类时出现错误未报告的异常 java.io.UnsuportedEncodingException 必须被捕获或声明为抛出。
      • @iggyweb:你需要捕获异常;除非您的代码中有错字,否则它永远不会被抛出。
      • 我已经修改了上面的行,但得到错误无法解析符号,符号变量 StandardCharsets。所以我添加了 mport java.nio.charset.StandardCharsets 但现在收到关于位置包字符集的错误。
      • @iggyweb 您使用哪个 Java 版本? StandardCharsets 随 Java 1.7 一起提供。如果您使用的是早期版本,请使用 s.getBytes("UTF-8") 并捕获异常。
      猜你喜欢
      • 2012-06-11
      • 2014-10-13
      • 2018-02-16
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多