我开始使用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字符。
我正在考虑立即编写自己的字符集,但是想知道这样的事情是否已经存在?
任何想法或指示?
答案 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控制台上的输出: