`
yangxiutian
  • 浏览: 61165 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

关于ZipInputStream乱码问题

阅读更多
    private static String getUTF8String(byte[] b, int off, int len) {
	// First, count the number of characters in the sequence
	int count = 0;
	int max = off + len;
	int i = off;
	while (i < max) {
	    int c = b[i++] & 0xff;
	    switch (c >> 4) {
	    case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
		// 0xxxxxxx
		count++;
		break;
	    case 12: case 13:
		// 110xxxxx 10xxxxxx
		if ((int)(b[i++] & 0xc0) != 0x80) {
		    throw new IllegalArgumentException();
		}
		count++;
		break;
	    case 14:
		// 1110xxxx 10xxxxxx 10xxxxxx
		if (((int)(b[i++] & 0xc0) != 0x80) ||
		    ((int)(b[i++] & 0xc0) != 0x80)) {
		    throw new IllegalArgumentException();
		}
		count++;
		break;
	    default:
		// 10xxxxxx, 1111xxxx
		throw new IllegalArgumentException();
	    }
	}
	if (i != max) {
	    throw new IllegalArgumentException();
	}
	// Now decode the characters...
	char[] cs = new char[count];
	i = 0;
	while (off < max) {
	    int c = b[off++] & 0xff;
	    switch (c >> 4) {
	    case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
		// 0xxxxxxx
		cs[i++] = (char)c;
		break;
	    case 12: case 13:
		// 110xxxxx 10xxxxxx
		cs[i++] = (char)(((c & 0x1f) << 6) | (b[off++] & 0x3f));
		break;
	    case 14:
		// 1110xxxx 10xxxxxx 10xxxxxx
		int t = (b[off++] & 0x3f) << 6;
		cs[i++] = (char)(((c & 0x0f) << 12) | t | (b[off++] & 0x3f));
		break;
	    default:
		// 10xxxxxx, 1111xxxx
		throw new IllegalArgumentException();
	    }
	}
	return new String(cs, 0, count);
    }

 以上是ZipInputStream读取有中文条目的zip包时会抛出异常的方法,该方法有两个while循环,第一个是统计条目名 字符数count,第二个是用UTF-8算法解码byte数组,提取到字符串 一切不是UTF-8的字符串直接抛异常,由于中文系统默认编码是GBK 所以条目名含有中文时直接抛异常。

不知道编码是提倡用循环统计 还是“变长数组”,该方法可以改成如下:

private static String getUTF8String(byte[] b, int off, int len) {CharArrayWriter caw=new CharArrayWriter();
		int i = 0;
		while (off < max) {
			int c = b[off++] & 0xff;
			switch (c >> 4) {
			case 0:
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
				// 0xxxxxxx 
				caw.append((char) c); 
				break;
			case 12:
			case 13:
				// 110xxxxx 10xxxxxx
//				 
				caw.append((char) (((c & 0x1f) << 6) | (b[off++] & 0x3f))); 
				break;
			case 14:
				// 1110xxxx 10xxxxxx 10xxxxxx
				int t = (b[off++] & 0x3f) << 6;
//				 
				caw.append((char) (((c & 0x0f) << 12) | t | (b[off++] & 0x3f))); 
				break;
			default:
				// 10xxxxxx, 1111xxxx
				throw new IllegalArgumentException();
			}
		}
		char[] ch=caw.toCharArray();
		return new String(ch, 0, ch.length);
	}
也就是把统计字符数改成CharArrayWriter类,利用它的“数组扩展特性”,该类默认分配初始数组为32大小,个人认为是比较合理的。不知各位比较支持哪种编程方法。
其次我们再来讨论乱码的问题。其实String类里面就封装了byte解码的功能了,这里不知道作者为什么要自己实现解码,还不负责任的抛异常 难道是想表现一下自己的技术?用字符串的解码 可以改成如下:
private static String getUTF8String(byte[] paramArrayOfByte, int paramInt1, int paramInt2)
  { 
    try{
      return new String(paramArrayOfByte, paramInt1, paramInt2,"UTF-8"); 
    }catch(UnsupportedEncodingException e){
      e.printStackTrace();
      return "encoding error!";
    }
  }
怎么样,够简单吧。
为了能够让用户自行设置编码,可以增加一个成员变量,增加一个方法 于是改成这样:
   private static String filenameEncoding=Charset.defaultCharset().toString();//默认使用系统默认编码
   public static void setFilenameEncoding(String encoding){
    filenameEncoding=encoding;
  }

 

private static String getUTF8String(byte[] b, int off, int len) {
  { 
    try{
      return new String(paramArrayOfByte, paramInt1, paramInt2,filenameEncoding); 
    }catch(UnsupportedEncodingException e){
      e.printStackTrace();
      return "encoding error!";
    }
  }
这样就“完美”了。
后记:以上代码楼主亲自测过功能没有问题 不过不知道为什么SUN不写成这样,写此博文旨在跟大家交流,楼主的语文学得不好 尽请见谅 希望大家能看懂意思并发表意见就好了。

 

分享到:
评论

相关推荐

    ZipInputStream解压有中文名报错问题解决

    以上就是关于“ZipInputStream解压有中文名报错问题”的详细解析,包括问题的根源、关键概念以及多种解决方案。在实际开发中,根据项目需求和环境选择合适的解决策略是非常重要的,以确保程序能够正确处理各种情况下...

    java 支持中文解压:一行代码解决 java.util.zip.ZipInputStream 中文乱码;--文件处理通用类

    1、文件解压zip通用机制方法、一行代码支持中文; 2、一行代码解决 java.util.zip.ZipInputStream 中文乱码; 3、删除指定路径内的所有文件通用机制方法;

    java zip压缩解压工具解决中文乱码问题

    在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...

    java解压乱码问题修正

    JAVA中文件压缩引起的乱码问题,是由于Java编码以Unicode 为基础的,所以ZipOutputStream(还有ZipInputStream) 处理压缩工作时,就以Unicode来处理中文。 所以为了能在压缩(或解压)时,不让其产生乱码问题,就得...

    文件解压和压缩 解决中文乱码

    这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...

    java解决压缩中文乱码

    在Java编程中,当涉及到文件压缩操作时,经常会遇到一个问题:中文字符在压缩过程中出现乱码。这主要是因为Java的标准库`java.util.zip`在处理非ASCII编码的字符时存在局限性。不过,通过一些技巧和自定义实现,我们...

    Java中压缩与解压--中文文件名乱码解决办法

    这个问题主要源于Java中默认使用的编码方式与实际文件名编码不一致,尤其是在Windows系统下,文件名通常采用GB2312或GBK编码,而Java中的`ZipInputStream`和`ZipOutputStream`类默认使用的是Unicode编码,这种编码...

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码  上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.  第二种 就是拿来主义,因为 开源项目 Ant 里已经有...

    安卓文件下载上传解压相关-javaandroidzip解压缩解决压缩中文乱码问题).rar

    本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现的乱码问题。 首先,让我们关注文件的下载和上传。在Android中,我们可以使用`java.net.URL`和`java...

    用于中文乱码解压和压缩

    因为本人工作需要解压文件,但是出现中文乱码,但是又不想用ant.jar 所以就只有将zipInputStream更改。当然我是转载别人的,经测试可以使用哦,哈哈 http://zwllxs.iteye.com/blog/871260 这是地址

    java实现的文件解压和压缩,没有中文编码问题

    在Java中,可以使用`Charset`类来指定正确的字符集,例如`StandardCharsets.UTF_8`,确保读写操作都使用UTF-8编码,这可以有效避免中文乱码问题。 3. **压缩文件**: 使用`ZipOutputStream`,可以将文件添加到ZIP...

    JAVA解压ZIP文件(可解压中文)

    在Java编程环境中,处理压缩文件,...在处理包含中文文件名的ZIP文件时,我们需要指定正确的字符编码,以避免解压后的乱码问题。通过上述步骤,我们可以编写出一个能够有效解压ZIP文件(包括中文文件名)的Java程序。

    java解压zip或rar压缩文件源码与jar包

    这篇描述提到了一个接口类,专门用于解决解压过程中可能出现的乱码问题。以下将详细讲解Java中解压ZIP和RAR文件的方法,以及如何处理乱码。 1. **Java解压ZIP文件**: - Java标准库提供了`java.util.zip`包,其中...

    知识收集2

    【描述】:虽然描述部分为空,但通过提供的博文链接可以推测,该主题可能涉及到一个实际的技术问题,即在使用Java进行文件压缩或解压缩时,可能会遇到文件名或内容出现乱码的情况。这通常是因为编码不一致导致的,...

    解决java压缩、解压缩含中文字符的文件或文件夹问题

    通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。

    apache-ant-zip.jar

    在处理中文文件名时,可能会遇到乱码问题,这通常与编码设置有关。"apache-ant-zip.jar" 文件是Apache Ant的一个组件,用于处理与ZIP归档相关的任务,特别是针对解决中文乱码问题进行了优化。 在Java中,处理ZIP...

    Java压缩和解压缩zip文件

    关于中文文件名的乱码问题,这是因为ZIP文件默认使用ASCII编码,无法正确表示非ASCII字符,如中文。为了解决这个问题,我们需要在创建 `ZipEntry` 时指定正确的字符集,通常是 "GBK" 或 "UTF-8": ```java ZipEntry...

    C#压缩DLL-ICSharpCode.SharpZipLib

    关于中文路径解压缩出现乱码的问题,这是一个常见的挑战,尤其是在处理非ASCII字符时。`ICSharpCode.SharpZipLib`库通常能很好地处理这些问题,但有时需要进行额外的配置或者编码转换来确保正确处理中文路径。 在`...

    java压缩包解压

    本文将深入探讨如何在Java中实现解压缩功能,以及解决在处理包含中文文件名时可能出现的乱码问题。 首先,Java提供了`java.util.zip`包,它包含了处理ZIP文件的相关类。我们主要使用`ZipInputStream`和`ZipEntry`来...

    支持中文的zip压缩解压

    在许多编程语言中,包括Java,处理中文字符可能会遇到编码问题,导致在压缩或解压缩过程中出现乱码。以下是对这一主题的详细解释。 首先,我们来了解一下ZIP文件格式。ZIP是一种广泛使用的文件格式,用于将多个文件...

Global site tag (gtag.js) - Google Analytics