霍夫曼:无法解压缩"æ"、"ø"、"å"和"•"等字符



我正在进行霍夫曼压缩(或者现在是解压缩(,我无法正确解压缩诸如"æ"、"ø"、‘å’和"•"之类的字符。字符"æ"被解压缩为两个符号ᅢᆭ'.你知道该做什么吗?

EDIT:我认为这可能与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();
}

使用InputStream进行读取,使用Writer进行写入。第一个用于读取二进制数据,第二个用于写入文本。当您调用bufferedWriter.write(node.getAByte())时,您正在执行隐式转换。

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

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

一个更好的方法是简单地将其视为二进制数据(如果它真的是文本,那也没关系,只要你不在乎解释代码中的文本,而你似乎没有这样做(。由于霍夫曼编码作用于字节流,所以它也更符合您对数据所做的操作。

为此,将Writer替换为OutputStream(即FileOutputStream,出于性能原因可能被封装在BufferedOutputStream中(。

最新更新