UTF-8的不可打印字符-SUSE Linux Java不';不支持

UTF-8的不可打印字符-SUSE Linux Java不';不支持,java,linux,utf-8,suse,non-printing-characters,Java,Linux,Utf 8,Suse,Non Printing Characters,我们正在实施一项功能,以支持数据库中UTF-8的不可打印字符。我们的系统将它们存储在数据库中并检索它们。我们以base 64的形式收集输入,将其转换为字节数组并存储在数据库中。在检索过程中,数据库给我们字节数组,我们再次将它们转换为基64 在检索过程中(在db给我们字节数组之后),所有属性都转换为字符串数组,然后再次转换回字节数组,并再次转换为base 64以将其返回给用户 下面的代码在我们的WindowsJDK(Java8版本)中编译并正常工作。但是,当把它放在SuSe Linux环境中时,我

我们正在实施一项功能,以支持数据库中UTF-8的不可打印字符。我们的系统将它们存储在数据库中并检索它们。我们以base 64的形式收集输入,将其转换为字节数组并存储在数据库中。在检索过程中,数据库给我们字节数组,我们再次将它们转换为基64

在检索过程中(在db给我们字节数组之后),所有属性都转换为字符串数组,然后再次转换回字节数组,并再次转换为base 64以将其返回给用户


下面的代码在我们的WindowsJDK(Java8版本)中编译并正常工作。但是,当把它放在SuSe Linux环境中时,我们会看到奇怪的字符

public class Tewst {
    public static void main(String[] args) {
        byte[] attributeValues;
        String utfString ;

        attributeValues = new byte[]{-86, -70, -54, -38, -6};
        if (attributeValues != null) {
            utfString = new String(attributeValues);
            System.out.println("The string is "+utfString);
        }
    }
}
给出的输出是

“字符串为&ÊÚú”

现在,当同一个文件在SuSe Linux发行版上运行时,它给了我:

“字符串是�����"

我们在Windows和Linux中都使用Java 8。它在Linux中不能正确执行的问题是什么


我们还尝试了
utfString=newstring(attributeValues,“UTF-8”);
。它没有任何帮助。我们缺少什么?

字符
是Unicode
00AA 00BA 00CA 00DA 00FA

在字符集ISO-8859-1中,即字节
AA-BA-CA-DA-FA

在十进制中,这将是
{-86,-70,-54,-38,-6}
,正如您在代码中所做的那样

因此,您的字符串是用ISO-8859-1编码的,而不是UTF-8编码的,这也是为什么它不能在Linux上工作的原因,因为Linux使用UTF-8,而Windows使用ISO-8859-1

永远不要使用
新字符串(byte[])
,除非您绝对确定需要JVM的默认字符集,不管是什么

将代码更改为新字符串(AttributeValue,StandardCharsets.ISO_8859_1)

当然,在反向操作中,使用
str.getBytes(StandardCharsets.ISO_8859_1)


然后is应该在不同的平台上一致工作,因为它不再使用平台默认值进行编码。

我想,这与Java程序无关,而是与打印字符串所用的字体有关。如果是这样,当字符串转换回字节数组时,它应该给出原始字节数组,但它给出了一些东西else,而不是原始字节数组。我们在字节数组中得到的是15个值,而不是5个值。您能显示此转换测试的代码吗?“下面的代码片段在我们的Windows JDK(Java 8版本)中编译并正常工作”似乎不太可能-如果这是UTF-8编码的文本,并且您使用的是默认编码(永远不要含蓄地这样做)这样你就不会得到正确的结果。它奏效了!!!:)非常感谢。我想我们的印象是我们正在使用UTF-8编码,只是意识到我们的编码不是UTF-8。谢谢Andreas。