我有一个字节数组。不相关:我使用iText库,并尝试从该数组中提取文本时以某种方式解析失败。我已经跟踪问题与损坏的PDF文档(字节)有关。所以,我想在将它提供给库之前编辑字节数组。
byte[] bytesArray;
String x = new String(bytesArray);
x = x.replace("foo", "bar");
library.parse(x.getBytes());
这与以下有什么不同?
library.parse(bytesArray);
感谢。
答案 0 :(得分:1)
这将是一个编码问题 - 从String
获得的new String(bytesArray)
将使用您的默认本地字符编码,这可能会将128 - 255范围内的字节错误地转换为其他字符。< / p>
映射不一定是1:1,因此再次转换可能会返回与您开始时不同的数组。
答案 1 :(得分:1)
使用:
说明:
构造函数new String(byte[])
和方法String.getBytes()
使用“平台默认字符编码”在字符和字节之间进行转换。并非所有字节序列都可以映射到所有字符编码中的字符。构造的String将包含unicode替换字符\ uFFFD,其中找到了不可映射的序列。解决方案是使用字符编码,其中每个字节序列都是合法的。一种这样的编码是ISO-8859-1。 (例如UTF-8不起作用。)
答案 2 :(得分:0)
PDF文档是二进制文件。它不包含字符,甚至不包含默认平台编码中的字符。假设您的平台编码是ASCII。 128以上的所有字节都不代表有效的ASCII字符。因此,当你获取一个字节数组并使其成为一个字符串时,一半的字节(平均而言)就无法转换为字符。
答案 3 :(得分:0)
您不添加可选字符编码参数:
new String(bytesArray, "UTF-8")
x.getBytes("UTF-8")
实际上,如果平台编码是UTF-8且bytesArray包含非法字节序列,那么就会出现问题。
以下是一个很好的字节替换器。
private void replaceBytes(ByteArrayInputStream in, ByteArrayOutputStream out, String from, String to) {
try {
byte[] fromBytes = from.getBytes("Cp1252");
byte[] toBytes = to.getBytes("Cp1252");
int fromN = fromBytes.length;
int fromPos = 0; // Matching input, not written to output.
for (;;) {
int b = in.read();
if (b == -1) {
if (fromPos != 0) {
out.write(fromBytes, 0, fromPos);
//fromPos = 0;
}
break;
}
if (b == fromBytes[fromPos]) {
++fromPos;
if (fromPos >= fromN) {
out.write(toBytes);
fromPos = 0;
}
} else {
if (fromPos != 0) {
out.write(fromBytes, 0, fromPos);
fromPos = 0;
}
out.write(b);
}
}
} catch (IOException ex) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
}
}