Java String.getBytes()问题
我有一个字节数组。无关:我使用iText库,在尝试从该数组中提取文本时,解析以某种方式失败。我已追踪到问题与损坏的PDF文档(字节)有关。因此,我希望在将字节数组馈送到库之前对其进行编辑Java String.getBytes()问题,java,pdf,byte,itext,Java,Pdf,Byte,Itext,我有一个字节数组。无关:我使用iText库,在尝试从该数组中提取文本时,解析以某种方式失败。我已追踪到问题与损坏的PDF文档(字节)有关。因此,我希望在将字节数组馈送到库之前对其进行编辑 byte[] bytesArray; String x = new String(bytesArray); x = x.replace("foo", "bar"); library.parse(x.getBytes()); 这与下面有什么不同 library.parse(bytesArray); 谢谢。这将
byte[] bytesArray;
String x = new String(bytesArray);
x = x.replace("foo", "bar");
library.parse(x.getBytes());
这与下面有什么不同
library.parse(bytesArray);
谢谢。这将是一个编码问题-从
新字符串(字节数组)
获得的字符串将使用默认的本地字符编码,这可能会将128-255范围内的字节转换为其他字符
映射不一定是1:1,因此再次转换可能会返回与开始时不同的数组。PDF文档是二进制文件。它不包含字符,在默认平台编码中甚至更少。假设您的平台编码是ASCII。128以上的所有字节都不代表有效的ASCII字符。所以,当您获取一个字节数组并使其成为字符串时,一半的字节(平均)无法转换为字符 不添加可选的字符编码参数:
新字符串(字节数组,“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);
}
}
使用:
- 新字符串(字节数组,“ISO-8859-1”)
- x、 getBytes(“ISO-8859-1”)
说明:
构造函数newstring(byte[])
和方法String.getBytes()
使用“平台默认字符编码”在字符和字节之间进行转换。并非所有字节序列都可以映射到所有字符编码中的字符。构造的字符串将包含发现不可映射序列的unicode替换字符\uFFFD。解决方案是使用字符编码,其中每个字节序列都是合法的。其中一种编码是ISO-8859-1。(例如UTF-8不起作用。)字节数组肯定包含“非法”序列:D如何检查原始编码,如果这样的事情是可能的?谢谢,我会给这一个去,并报告回来。对不起,忘了提供反馈。你的答案正是我想要的。谢谢很遗憾Java没有提供简单的“原始”字符编码,这意味着“给我该死的比特”!这就是getChars方法所做的——Java字符串是根据16位字符而不是8位字节定义的。如果需要等效字节数组,请使用编码utf-16le。