是否有一个特殊的字符集将所有可能的字节值映射到有效的字符并返回?

时间:2013-03-17 19:28:22

标签: java string pdf character-encoding binary

我开始使用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:“此方法总是使用此charset的默认替换字符串替换格式错误的输入和不可映射的字符序列”。

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

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

我正在考虑立即编写自己的字符集,但是想知道这样的事情是否已经存在?

任何想法或指示?

2 个答案:

答案 0 :(得分:1)

每个文本字符串都可以有自己的自定义编码。使用现有的PDF库,您将在longrun中省去很多麻烦。

答案 1 :(得分:0)

我测试了Marko Topolnik的建议,似乎有效:

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));
    }
  }
}

我的eclipse控制台上的输出:

enter image description here