1

我在将电子邮件附件(带有拉丁和西里尔符号的 windows-1251 编码中的简单文本文件)转换为字符串时遇到了麻烦。即我在转换西里尔字母时遇到问题。我将附件文件作为 base64 编码的字符串,如下所示:

Base64Encoded 电子邮件附件

原始文件

所以当我尝试解码它时,我得到了“?” 而不是西里尔符号。

我怎样才能得到正确的西里尔文(俄语)符号而不是“?”

我已经用所有编码尝试过这段代码,但没有任何帮助来获得正确的俄罗斯符号。

    BASE64Decoder dec = new BASE64Decoder();

    for (String key : Charset.availableCharsets().keySet()) {
        System.out.println("K=" + key + " Value:" +
                           Charset.availableCharsets().get(key));
        try {
            System.out.println(new String(dec.decodeBuffer(encoded), key));
        } catch (Exception e) {
            continue;
        }
    }

事先谢谢你。

4

1 回答 1

0

我对 BPEL 及其使用的协议不是很熟悉。如果您使用某些二进制协议在节点之间进行通信,那么您必须 1)确保客户端和接收器使用相同的字符集,以及 2)将 java 字符串转换为此编码中的正确字节。Java在内部以 UTF-16 格式存储字符串。因此,当您执行时,String correct = new String(commonName.getBytes("ISO-8859-1"), "ISO-8859-5")您将获得正确的 UTF-16 字符串。然后您需要将其导出为请求编码中的字节,例如。byte[] buff = correct.getBytes("UTF-8")假设您在节点之间使用的编码是 UTF-8。如果发生编码不同,那么您必须确保它实际上支持西里尔字符(例如 ISO-8859-1 不支持它)。

如果您使用 XML 进行数据交换,请确保它使用<?xml encoding="UTF-8"?>. 你不需要再玩字节,你只需要正确“导入”字符串(见correct变量)。写入 XML 会自动转换字符,但它(编码)必须支持您要写入的字符。因此,如果您设置encoding="ISO-88591",那么您将再次获得那些问号。

于 2014-02-09T14:29:44.870 回答