Java String.getBytes()问题

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); 谢谢。这将

我有一个字节数组。无关:我使用iText库,在尝试从该数组中提取文本时,解析以某种方式失败。我已追踪到问题与损坏的PDF文档(字节)有关。因此,我希望在将字节数组馈送到库之前对其进行编辑

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。