首页 > 解决方案 > 霍夫曼:无法解压缩“æ”、“ø”、“å”和“•”等字符

问题描述

我正在处理我的 Huffman 压缩(或在这一点上进行解压缩),我无法正确解压缩像 'æ'、'ø'、'å' 和 '•' 这样的字符。字符“æ”被解压缩为两个符号“ᅢᆭ”。知道应该做什么吗?

编辑:我认为这可能与 BufferedWriter 和 InputStream (以及其他)有关。我可能需要以 UTF-8 或其他方式读写?我怎么做?

编辑 2: : 在一些帮助热线的帮助下,我发现 'ᅢ' 和 'ᆭ' 作为单个字符写入文件。'ø' 是否大于 1 个字节,也许我假设每个字符在某处都是 1 个字节?

public static void decompressFile() throws IOException {

    
    byte[] compressedBytes = //somecode
    int[] frequencyTable = //somecode

    HuffmanNode root = //some code

    //Generating code table
    String[] codeTable = new String[256];
    Huffman.getCodeTable(codeTable, root, "");

    DataInputStream inputStream = new DataInputStream(new BufferedInputStream(new FileInputStream("[//thecompressedfile]"
    BitInputStream bitInputStream = new BitInputStream(inputStream, compressedBytes.length);

    BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(newFileName));


    HuffmanNode node = root;
    int bit;


    while ((bit = bitInputStream.readBit()) != -1) {
        //int bit = bitInputStream.readBit();
        System.out.print(bit + "");

        if (bit == 0) {
            node = node.getLeft();
            if (node.isLeaf()) {
                bufferedWriter.write(node.getAByte());
                node = root;
            }
        } else if (bit == 1) {
            node = node.getRight();
            if (node.isLeaf()) {
                bufferedWriter.write(node.getAByte());
                node = root;
            }
        }
    }

    bufferedWriter.close();
}

标签: javaarrayshuffman-code

解决方案


您使用 a 读取InputStream和使用 a 写入Writer。第一个用于读取二进制数据,第二个用于写入文本。当您调用bufferedWriter.write(node.getAByte()).

换句话说,您将二进制数据解释为 ISO-8859-1,因为您基本上是将一个字节转换为 a char(技术上是int出于……奇怪的原因)。然后,您将使用平台默认编码将其写回。

这会弄乱你的文本,除非它恰好是ISO-8859-1 编码并且平台默认编码是相同的。

更好的方法是简单地将其视为二进制数据(如果它真的是文本,那很好,只要您不关心解释代码中的文本,您似乎不这样做)。由于霍夫曼编码作用于字节流,这也更接近于您对数据所做的事情。

为此,请Writer用 an替换OutputStream(即 a ,出于性能原因FileOutputStream可能包含在 a中)。BufferedOutputStream


推荐阅读