Обычно после использования Java для упаковки файлов и создания сжатых файлов искаженные символы появляются в следующих двух местах:
1. Проблема искаженного контента на китайском языке. Многие пользователи Интернета предлагают решения этой проблемы. Существует два основных метода: один — изменить исходный код sun; другой — использовать библиотеку классов с открытым исходным кодом org.apache. .tools.zip.ZipOutputStream и org.apache.tools.zip.ZipEntry, эти два класса включены в ant.jar и их можно скачать и использовать напрямую. Нет сомнений, что удобнее выбрать последний.
2. Проблема искажения китайских символов в комментариях к сжатым файлам: zos.setComment("Китайский тест"); в сети меньше информации о решении этой проблемы. С тестовыми классами, созданными проектом на моей машине, проблем не было, но при использовании в проектах компании продолжали появляться искаженные символы. При использовании метода установки кодировки (zos.setEncoding("gbk");), Наконец я нашел проблему в тестовом проекте. Метод кодирования — gbk, а кодировка проекта компании по умолчанию — utf-8, поэтому с тестовым проектом проблем нет, но есть проблема с проектом компании.
org.apache.tools.zip.ZipOutputStream по умолчанию использует метод кодирования проекта. Теоретически, utf-8 также поддерживает китайский язык. Я действительно не могу понять, почему он все еще искажен. Эту проблему можно решить, изменив setEncoding. метод ГБК.
Пример кода для вышеуказанной проблемы выглядит следующим образом:
пакет com.compress;импорт java.io.BufferedInputStream;импорт java.io.BufferedOutputStream;импорт java.io.DataInputStream;импорт java.io.File;импорт java.io.FileInputStream;импорт java.io.FileOutputStream;импорт org. apache.tools.zip.ZipEntry;импорт org.apache.tools.zip.ZipOutputStream; public class CompressEncodingTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { File f = new File("Chinese test. txt"); ZipOutputStream zos = новый ZipOutputStream(новый BufferedOutputStream(новый FileOutputStream("zipTest.zip"), 1024)); zos.putNextEntry(new ZipEntry("Chinese.txt")); DataInputStream dis = новый DataInputStream(new BufferedInputStream(new FileInputStream(f))); zos.putNextEntry(new) ZipEntry(f.getName())); int c; while ((c = dis.read()) != -1) { zos.write(c); } zos.setEncoding("gbk"); zos.setComment("Китайский тест"); ; }}