我有一个用Java处理字节数组的程序,现在我想把它写成一个XML文件。但是,我不确定如何将以下字节数组转换为合理的字符串以写入文件。假设它是Unicode字符,我尝试了以下代码:
String temp = new String(encodedBytes, "UTF-8");
仅让调试器显示encodedBytes包含"\ufffd\ufffd ^\ufffd\ufffd-m\ufffd\ufffd\/ufffd \ufffd\ufffdIA\ufffd\ufffd"
。 String应包含字母数字格式的哈希。
如何将上面的String转换为合理的输出字符串?
答案 0 :(得分:10)
字节数组看起来不像UTF-8。请注意,\ufffd
(名为REPLACEMENT CHARACTER
)为"used to replace an incoming character whose value is unknown or unrepresentable in Unicode."
附录:这是一个如何发生这种情况的简单示例。当转换为byte
时,ñ
的代码点既不是UTF-8也不是US-ASCII;但它 有效ISO-8859-1。实际上,在将它们编码为String
之前,您必须知道字节代表什么。
public class Hello {
public static void main(String[] args)
throws java.io.UnsupportedEncodingException {
String s = "Hola, señor!";
System.out.println(s);
byte[] b = new byte[s.length()];
for (int i = 0; i < b.length; i++) {
int cp = s.codePointAt(i);
b[i] = (byte) cp;
System.out.print((byte) cp + " ");
}
System.out.println();
System.out.println(new String(b, "UTF-8"));
System.out.println(new String(b, "US-ASCII"));
System.out.println(new String(b, "ISO-8859-1"));
}
}
输出:
Hola, señor! 72 111 108 97 44 32 115 101 -15 111 114 33 Hola, se�or! Hola, se�or! Hola, señor!
答案 1 :(得分:7)
如果你的字符串是密码散列方案的输出(它看起来可能是这样),那么我认为你需要使用Base64编码才能将其放入纯文本中。
标准过程,如果您要输出到文本文件的原始字节,则使用Base 64编码。 Commons Codec库提供了Base64编码器/解码器供您使用。
希望这有帮助。