Java String.getBytes()问题

时间:2012-01-10 18:18:38

标签: 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);

感谢。

4 个答案:

答案 0 :(得分:1)

这将是一个编码问题 - 从String获得的new String(bytesArray)将使用您的默认本地字符编码,这可能会将128 - 255范围内的字节错误地转换为其他字符。< / p>

映射不一定是1:1,因此再次转换可能会返回与您开始时不同的数组。

答案 1 :(得分:1)

使用:

  • new String(bytesArray,“ISO-8859-1”)
  • x.getBytes( “ISO-8859-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);
    }
}