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

Java 是否有一个特殊的字符集将所有可能的字节值映射到有效字符并返回?,java,string,pdf,character-encoding,binary,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 an

我开始使用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);
这失败了,因为引用了字符串构造函数的javadoc:“这个方法总是用这个字符集的默认替换字符串替换格式错误的输入和不可映射的字符序列”

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

我只需要能够使用ascii字符

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


有什么想法或建议吗?

我测试了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));
    }
  }
}
公共类CharsetTest
{
@试验
公开无效测试()
{
字节[]allByteValues=新字节[256];
字节字节值=字节最小值;
for(int i=0;i
eclipse控制台上的输出:


我测试了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));
    }
  }
}
公共类CharsetTest
{
@试验
公开无效测试()
{
字节[]allByteValues=新字节[256];
字节字节值=字节最小值;
for(int i=0;i
eclipse控制台上的输出:


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

每个文本字符串都可以有自己的自定义编码。使用现有的PDF库可以在长期运行中为自己省去很多麻烦。

只需使用ISO-8859-1或任何其他1字节ASCII超集。为什么不使用知道如何正确处理PDF的库呢?例如,ApachePDFBox——下半部分的ASCII字符是0-63,不包含字母,因为所有ASCII字符都是0-127。我猜你的意思只是ASCII码。马克:我会试试的。拉代:当然是钱。我找不到支持PDF签名的免费PDF库。克里斯托弗:你说得对,我会相应地编辑我的问题。@Zalumon PDFBox确实以基本方式支持PDF签名,并且通常不使用Apache。IText以更舒适的方式支持PDF签名,并且可以根据AGPL自由使用。两者都比您的方法更好地处理PDF编码。只需使用ISO-8859-1或任何其他1字节ASCII超集。为什么不使用知道如何正确处理PDF的库呢?例如,ApachePDFBox——下半部分的ASCII字符是0-63,不包含字母,因为所有ASCII字符都是0-127。我猜你的意思只是ASCII码。马克:我会试试的。拉代:当然是钱。我找不到支持PDF签名的免费PDF库。克里斯托弗:你说得对,我会相应地编辑我的问题。@Zalumon PDFBox确实以基本方式支持PDF签名,并且通常不使用Apache。IText以更舒适的方式支持PDF签名,并且可以根据AGPL自由使用。两者都比您的方法更了解PDF编码的处理。当然,但这是一个完全不同的讨论;-)是的,但这是一个完全不同的讨论;-)