java - 霍夫曼:无法解压缩“æ”、“ø”、“å”和“•”等字符
问题描述
我正在处理我的 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();
}
解决方案
您使用 a 读取InputStream
和使用 a 写入Writer
。第一个用于读取二进制数据,第二个用于写入文本。当您调用bufferedWriter.write(node.getAByte())
.
换句话说,您将二进制数据解释为 ISO-8859-1,因为您基本上是将一个字节转换为 a char
(技术上是int
出于……奇怪的原因)。然后,您将使用平台默认编码将其写回。
这会弄乱你的文本,除非它恰好是ISO-8859-1 编码并且平台默认编码是相同的。
更好的方法是简单地将其视为二进制数据(如果它真的是文本,那很好,只要您不关心解释代码中的文本,您似乎不这样做)。由于霍夫曼编码作用于字节流,这也更接近于您对数据所做的事情。
为此,请Writer
用 an替换OutputStream
(即 a ,出于性能原因FileOutputStream
可能包含在 a中)。BufferedOutputStream
推荐阅读
- java - 带有蓝色事物的 VS Code Java 输出“HelloWorld”
- android - 检查下载中的自定义文件夹中是否存在文件 - 不推荐使用 getExternalStoragePublicDirectory
- c# - 在 Parallel.ForEach 循环 C# 中错误捕获的特定异常
- python - 使用 isin 过滤数据框
- r - 删除逗号并不断收到“视图错误:'names' 属性 [17] 必须与向量 [1] 的长度相同”
- typescript - 为什么我在使用 TypeScript 的 try-catch 中使用 var 变量得到“变量在被分配之前使用”?
- c - 如何拒绝此代码中的非数字输入?
- apache-kafka - Kafka Stream - 按 client_id 过滤
- python - 如何在python和pdfminer中删除单个或可行的单词表单列表无法隐藏卢比字体
- node.js - webpack 或 node 如何知道如何从 node_modules 中选择插件?