Java UTF-8 编码问题

Posted

技术标签:

【中文标题】Java UTF-8 编码问题【英文标题】:Java UTF-8 Encoding Issue 【发布时间】: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;

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

【问题讨论】:

【参考方案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") 并捕获异常。

以上是关于Java UTF-8 编码问题的主要内容,如果未能解决你的问题,请参考以下文章

C# XML 字符串编码问题

编码问题

Java FileReader 编码问题

Java 和 JS/AS3 之间 URL 解码/编码 UTF-8 的差异(错误!?)

Eclipse 中的 Java 属性 UTF-8 编码

Eclipse 中的 Java 属性 UTF-8 编码