عادةً، بعد استخدام Java لحزم الملفات وإنشاء ملفات مضغوطة، ستظهر الأحرف المشوهة في المكانين التاليين:
1. مشكلة المحتوى الصيني المشوه قدم العديد من الأشخاص على الإنترنت حلولاً لهذه المشكلة. هناك طريقتان رئيسيتان: إحداهما تعديل الكود المصدري للشمس؛ والأخرى هي استخدام مكتبة الفئة مفتوحة المصدر 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 طريقة لGBK.
نموذج التعليمات البرمجية للمشكلة المذكورة أعلاه كما يلي:
package com.compress;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import org. apache.tools.zip.ZipEntry;import 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 = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream("zipTest.zip"), 1024)); zos.putNextEntry(new ZipEntry("Chinese.txt")); DataInputStream dis = new DataInputStream(new BufferedInputStream( new FileInputStream(f))); ZipEntry(f.getName())); int c; dis.read())!= -1) { zos.write(c); zos.setEncoding("gbk"); }}