1

我开始使用 PDF 规范。PDF 文件是文本和二进制数据的混合体。为了进行一些快速而肮脏的编辑,我想将文件读入字符串,查找并替换一些文本部分,然后将字符串写回文件,同时保留除我替换的字节之外的所有字节。

我的第一次天真的尝试是这样的:

byte[] orignalBytes = ...; // read bytes from file
String content = new String(originalBytes, StandardCharsets.US_ASCII);
// do some find and replace (only working with ASCII chars)
byte[] changedBytes = content.getBytes(StandardCharsets.US_ASCII);

这失败了,因为引用 String 构造函数的 javadoc:“此方法总是用此字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列”。

我正在寻找一个特殊的字符集,它映射来自 US_ASCII 字符集的所有字符,此外“在从 byte[] 转换为 String 并返回时保留所有其他字节的值”。

我只需要能够使用 ascii 字符。

我现在正在考虑编写自己的字符集,但想知道这样的东西是否已经存在?

任何想法或指示?

4

2 回答 2

1

每个文本字符串都可以有自己的自定义编码。从长远来看,使用现有的 PDF 库将为您省去很多麻烦。

于 2013-03-17T21:41:32.600 回答
0

I tested Marko Topolnik's suggestion, it seems to work:

public class CharsetTest
{
  @Test
  public void test()
  {
    byte[] allByteValues = new byte[256];

    byte byteValue = Byte.MIN_VALUE;

    for(int i = 0; i < allByteValues.length; i++)
    {
      allByteValues[i] = byteValue;
      byteValue++;
    }

    {
      System.out.println(Arrays.toString(allByteValues));
      String string = new String(allByteValues, StandardCharsets.US_ASCII);
      System.out.println(string);
      byte[] bytesFromString = string.getBytes(StandardCharsets.US_ASCII);
      System.out.println(Arrays.toString(bytesFromString));
      System.out.println("equal: " + Arrays.equals(allByteValues, bytesFromString));
      System.out.println();

      Assert.assertFalse(Arrays.equals(allByteValues, bytesFromString));
    }
    {
      System.out.println(Arrays.toString(allByteValues));
      String string = new String(allByteValues, StandardCharsets.ISO_8859_1);
      System.out.println(string);
      byte[] bytesFromString = string.getBytes(StandardCharsets.ISO_8859_1);
      System.out.println(Arrays.toString(bytesFromString));
      System.out.println("equal: " + Arrays.equals(allByteValues, bytesFromString));
      System.out.println();

      Assert.assertTrue(Arrays.equals(allByteValues, bytesFromString));
    }
  }
}

The output on my eclipse console:

enter image description here

于 2013-03-17T19:59:43.893 回答