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

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コンソールの出力:

ここに画像の説明を入力

于 2013-03-17T19:59:43.893 に答える