谁能帮我解决以下问题,我写了解压zip文件的一个类,但是无法解压带有中文文件名的zip文件 import Util.*;我好像没找到这个包啊. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我写错了是不用package Util.*;package UnZip;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */import java.util.zip.*;import java.util.*;import java.io.*;public class UnZipFile { static final int BUFFER = 2048; public static void main(String[] args) { ZipFile zipFile; BufferedOutputStream dest = null; BufferedInputStream is = null; try { zipFile = new ZipFile("F:\\DoctorFundProject\\java°æ\\Merlia_Trial_2.01.zip"); //System.out.println("³É¹¦´´½¨"); //System.out.println(zipFile.size()); Enumeration e = zipFile.entries(); for (; e.hasMoreElements(); ) { ZipEntry zipEntry = (ZipEntry)e.nextElement(); if (!zipEntry.isDirectory()) { String filename = new String(zipEntry.getName().getBytes("gb2312"), "ISO-8859-1"); System.out.println(filename + zipEntry.getName()); System.out.println("Extracting: " + zipEntry.getName()); is = new BufferedInputStream(zipFile.getInputStream(zipEntry)); //System.err.println("is.available::"+is.available()); int count; byte data[] = new byte[BUFFER]; //File file = new File(); String path = "e:\\zipfile"; String str = zipEntry.getName(); String FileSeparator = System.getProperty("file.separator"); String[] result = ToolKit.split(str, "/"); //System.out.println(result.length); for (int i = 0; i < result.length - 1; i++) { path = path + "\\" + result[i]; //System.out.println(result[i]); } System.out.println(path); /*if(str.indexOf("/")) { System.out.println("´æÔÚ/"); }*/ File file = new File(path); if (!file.exists()) { if (file.mkdirs()) { System.out.println("Ŀ¼³É¹¦´´½¨"); } } path += "\\"; FileOutputStream fos = new FileOutputStream(path + result[result.length - 1]); dest = new BufferedOutputStream(fos, BUFFER); while ( (count = is.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); is.close(); } } } catch(ZipException zipe) { System.out.println(zipe.getMessage()); zipe.printStackTrace(); } catch(IOException ioe) { System.out.println(ioe.getMessage()); ioe.printStackTrace(); } }} 我写错了是不用package Util.*;package UnZip;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */import java.util.zip.*;import java.util.*;import java.io.*;public class UnZipFile { static final int BUFFER = 2048; public static void main(String[] args) { ZipFile zipFile; BufferedOutputStream dest = null; BufferedInputStream is = null; try { zipFile = new ZipFile("F:\\DoctorFundProject\\java°æ\\Merlia_Trial_2.01.zip"); //System.out.println("³É¹¦´´½¨"); //System.out.println(zipFile.size()); Enumeration e = zipFile.entries(); for (; e.hasMoreElements(); ) { ZipEntry zipEntry = (ZipEntry)e.nextElement(); if (!zipEntry.isDirectory()) { String filename = new String(zipEntry.getName().getBytes("gb2312"), "ISO-8859-1"); System.out.println(filename + zipEntry.getName()); System.out.println("Extracting: " + zipEntry.getName()); is = new BufferedInputStream(zipFile.getInputStream(zipEntry)); //System.err.println("is.available::"+is.available()); int count; byte data[] = new byte[BUFFER]; //File file = new File(); String path = "e:\\zipfile"; String str = zipEntry.getName(); String FileSeparator = System.getProperty("file.separator"); String[] result = ToolKit.split(str, "/"); //System.out.println(result.length); for (int i = 0; i < result.length - 1; i++) { path = path + "\\" + result[i]; //System.out.println(result[i]); } System.out.println(path); /*if(str.indexOf("/")) { System.out.println("´æÔÚ/"); }*/ File file = new File(path); if (!file.exists()) { if (file.mkdirs()) { System.out.println("Ŀ¼³É¹¦´´½¨"); } } path += "\\"; FileOutputStream fos = new FileOutputStream(path + result[result.length - 1]); dest = new BufferedOutputStream(fos, BUFFER); while ( (count = is.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); is.close(); } } } catch(ZipException zipe) { System.out.println(zipe.getMessage()); zipe.printStackTrace(); } catch(IOException ioe) { System.out.println(ioe.getMessage()); ioe.printStackTrace(); } }} 我写错了,是不用package Util.*;package UnZip;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */import java.util.zip.*;import java.util.*;import java.io.*;public class UnZipFile { static final int BUFFER = 2048; public static void main(String[] args) { ZipFile zipFile; BufferedOutputStream dest = null; BufferedInputStream is = null; try { zipFile = new ZipFile("F:\\DoctorFundProject\\java°æ\\Merlia_Trial_2.01.zip"); //System.out.println("³É¹¦´´½¨"); //System.out.println(zipFile.size()); Enumeration e = zipFile.entries(); for (; e.hasMoreElements(); ) { ZipEntry zipEntry = (ZipEntry)e.nextElement(); if (!zipEntry.isDirectory()) { String filename = new String(zipEntry.getName().getBytes("gb2312"), "ISO-8859-1"); System.out.println(filename + zipEntry.getName()); System.out.println("Extracting: " + zipEntry.getName()); is = new BufferedInputStream(zipFile.getInputStream(zipEntry)); //System.err.println("is.available::"+is.available()); int count; byte data[] = new byte[BUFFER]; //File file = new File(); String path = "e:\\zipfile"; String str = zipEntry.getName(); String FileSeparator = System.getProperty("file.separator"); String[] result = ToolKit.split(str, "/"); //System.out.println(result.length); for (int i = 0; i < result.length - 1; i++) { path = path + "\\" + result[i]; //System.out.println(result[i]); } System.out.println(path); /*if(str.indexOf("/")) { System.out.println("´æÔÚ/"); }*/ File file = new File(path); if (!file.exists()) { if (file.mkdirs()) { System.out.println("Ŀ¼³É¹¦´´½¨"); } } path += "\\"; FileOutputStream fos = new FileOutputStream(path + result[result.length - 1]); dest = new BufferedOutputStream(fos, BUFFER); while ( (count = is.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, count); } dest.flush(); dest.close(); is.close(); } } } catch(ZipException zipe) { System.out.println(zipe.getMessage()); zipe.printStackTrace(); } catch(IOException ioe) { System.out.println(ioe.getMessage()); ioe.printStackTrace(); } }} String[] result = ToolKit.split(str, "/");当中的ToolKit这个类是哪儿的?你把你贴出来的这段代码编译一下吧,好象通不过的.是不是缺了什么东西?你是不是用了什么开发工具?你把你的代码copy倒notepad,然后编译试试,通不过. 忘了这个文件,不好意思,一定要帮个忙package Util;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author not attributable * @version 1.0 */public class ToolKit { public static String[] split(String str, String div, boolean isRegular) { String result[] = null; //返回结果集合 String substr; if (str == null || div == null) { return (null); } if ((str = str.trim()).length() == 0) return (new String[]{str}); int cur = 0, cnt = 0, prv = cur, end; while (cur < str.length()) { if ((end = str.indexOf(div, cur)) < 0) { end = str.length(); } substr = str.substring(cur, end); if (isRegular) { cnt += stringCount(substr, "("); cnt -= stringCount(substr, ")"); } if (isRegular == false || cnt == 0 || end == str.length()) { substr = str.substring(prv, end); if (result == null) { result = new String[]{new String(substr)}; } else { int len = result.length; String array[] = new String[len + 1]; for (int i = 0; i < len; i++) array[i] = result[i]; result = array; result[len] = new String(substr); } } cur = end + div.length(); if (isRegular == false || cnt == 0) prv = cur; } return (result); } private static int stringCount(String str, String div) { int cnt = 0; int pos = 0; while ((pos = str.indexOf(div, pos)) >= 0) { pos += div.length(); cnt++; } return cnt; } public static String[] split(String str, String div) { return split(str, div, false); } public static void main(String[] args) { }} 关键问题在这里,你要搞清楚你的程序中所使用的字符串都是以什么格式编码的.String filename = new String(zipEntry.getName().getBytes("gb2312"),"ISO-8859-1");还有处理字符串的那个类ToolKit,是针对什么编码格式的. 我这里有一篇介绍java中汉字问题的文章,希望对你有所帮助.Java 编程技术中汉字问题的分析及解决-------------------------------------------------------------------------------- 在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java 语言默认的编码方式是UNICODE ,而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编码的常识入手,结合 Java 编程实例,分析以上两个问题并提出解决它们的方案。 -------------------------------------------------------------------------------- 现在 Java 编程语言已经广泛应用于互联网世界,早在 Sun 公司开发 Java 语言的时候,就已经考虑到对非英文字符的支持了。Sun 公司公布的 Java 运行环境(JRE)本身就分英文版和国际版,但只有国际版才支持非英文字符。不过在 Java 编程语言的应用中,对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样完美,因为中文字符集不只一个,而且不同的操作系统对中文字符的支持也不尽相同,所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们。有很多关于这些问题的解答,但都比较琐碎,并不能够满足大家迫切解决问题的愿望,关于 Java 中文问题的系统研究并不多,本文从汉字编码常识出发,分析 Java 中文问题,希望对大家解决这个问题有所帮助。 汉字编码的常识 我们知道,英文字符一般是以一个字节来表示的,最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符,而汉字成千上万,所以现在都以双字节来表示汉字,为了能够与英文字符分开,每个字节的最高位一定为1,这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等。关于具体编码方式的详细资料,有兴趣的读者可以查阅相关资料。我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码,中华人民共和国国家标准汉字信息交换用编码,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆地区及新加坡,简称国标码。两个字节中,第一个字节(高字节)的值为区号值加32(20H),第二个字节(低字节)的值为位号值加32(20H),用这两个值来表示一个汉字的编码。UNICODE 码是微软提出的解决多国字符问题的多字节等长编码,它对英文字符采取前面加“0”字节的策略实现等长兼容。如 “A” 的 ASCII 码为0x41,UNICODE 就为0x00,0x41。利用特殊的工具各种编码之间可以互相转换。 Java 中文问题的初步认识 我们基于 Java 编程语言进行应用开发时,不可避免地要处理中文。Java 编程语言默认的编码方式是 UNICODE,而我们通常使用的数据库及文件都是基于 GB2312 编码的,我们经常碰到这样的情况:浏览基于 JSP 技术的网站看到的是乱码,文件打开后看到的也是乱码,被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。 String sEnglish = “apple”; String sChinese = “苹果”; String s = “苹果 apple ”; sEnglish 的长度是5,sChinese的长度是4,而 s 默认的长度是14。对于 sEnglish来说, Java 中的各个类都支持得非常好,肯定能够正确显示。但对于 sChinese 和 s 来说,虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持(默认 UNICODE 编码),但是如果操作系统的默认编码不是 UNICODE ,而是国标码等。从 Java 源代码到得到正确的结果,要经过 “Java 源代码-> Java 字节码-> ;虚拟机->操作系统->显示设备”的过程。在上述过程中的每一步骤,我们都必须正确地处理汉字的编码,才能够使最终的显示结果正确。 “ Java 源代码-> Java 字节码”,标准的 Java 编译器 javac 使用的字符集是系统默认的字符集,比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1,所以大家会发现在 Linux 操作系统上编译的类中源文件中的中文字符都出了问题,解决的办法就是在编译的时候添加 encoding 参数,这样才能够与平台无关。用法是 javac –encoding GBK。 “ Java 字节码->虚拟机->操作系统”, Java 运行环境 (JRE) 分英文版和国际版,但只有国际版才支持非英文字符。 Java 开发工具包 (JDK) 肯定支持多国字符,但并非所有的计算机用户都安装了 JDK 。很多操作系统及应用软件为了能够更好的支持 Java ,都内嵌了 JRE 的国际版本,为自己支持多国字符提供了方便。 “操作系统->显示设备”,对于汉字来说,操作系统必须支持并能够显示它。英文操作系统如果不搭配特殊的应用软件的话,是肯定不能够显示中文的。 还有一个问题,就是在 Java 编程过程中,对中文字符进行正确的编码转换。例如,向网页输出中文字符串的时候,不论你是用 out.println(string); // string 是含中文的字符串 还是用 <%=string%>,都必须作 UNICODE 到 GBK 的转换,或者手动,或者自动。在 JSP 1.0中,可以定义输出字符集,从而实现内码的自动转换。用法是 <%@page ContentType=”text/html;charset=gb2312” %> 但是在一些 JSP 版本中并没有提供对输出字符集的支持,(例如 JSP 0.92),这就需要手动编码输出了,方法非常多。最常用的方法是 String s1 = request.getParameter(“keyword”); String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”); getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组,而“GBK” 是目标编码方式。我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 ,经过上述转换过程,在支持 GBK 字符集 的操作系统和应用软件中就能够正确显示中文字符串 s2 。 Java 中文问题的表层分析及处理 背景 开发环境 JDK1.15 Vcafe2.0 JPadPro 服务器端 NT IIS Sybase System Jconnect(JDBC) 客户端 IE5.0 Pwin98 .CLASS 文件存放在服务器端,由客户端的浏览器运行 APPLET , APPLET 只起调入 FRAME 类等主程序的作用。界面包括 Textfield ,TextArea,List,Choice 等。 I. 取中文 用 JDBC 执行 SELECT 语句从服务器端读取数据(中文)后,将数据用 APPEND 方法加到 TextArea(TA) ,不能正确显示。但加到 List 中时,大部分汉字却可正确显示。 将数据按“ISO-8859-1” 编码方式转化为字节数组,再按系统缺省编码方式 (Default Character Encoding) 转化为 STRING ,即可在 TA 和 List 中正确显示。 程序段如下: dbstr2 = results.getString(1); //After reading the result from DB server,converting it to string. dbbyte1 = dbstr2.getBytes(“iso-8859-1”); dbstr1 = new String(dbbyte1); 在转换字符串时不采用系统默认编码方式,而直接采用“ GBK” 或者 “GB2312” ,在 A 和 B 两种情况下,从数据库取数据都没有问题。 II. 写中文到数据库 处理方式与“取中文”相逆,先将 SQL 语句按系统缺省编码方式转化为字节数组,再按“ISO-8859-1”编码方式转化为 STRING ,最后送去执行,则中文信息可正确写入数据库。 程序段如下: sqlstmt = tf_input.getText(); //Before sending statement to DB server,converting it to sql statement. dbbyte1 = sqlstmt.getBytes(); sqlstmt = newString(dbbyte1,”iso-8859-1”); _stmt = _con.createStatement(); _stmt.executeUpdate(sqlstmt); …… 问题:如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时(称为 A 情况),上述程序代码可正确执行。但是如果客户机只有浏览器,而没有 JDK 和 CLASSPATH 时(称为 B 情况),则汉字无法正确转换。 我们的分析: 1.经过测试,在 A 情况下,程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 情况下,程序启动时浏览器的 JAVA 控制台中出现如下错误信息: Can't find resource for sun.awt.windows.awtLocalization_zh_CN 然后系统的缺省编码方式为“8859-1”。 2.如果在转换字符串时不采用系统缺省编码方式,而是直接采用 “GBK” 或“GB2312”,则在 A 情况下程序仍然可正常运行,在 B 情况下,系统出现错误: UnsupportedEncodingException。 3.在客户机上,把 JDK 的 CLASSES.ZIP 解压后,放在另一个目录中, CLASSPATH 只包含该目录。然后一边逐步删除该目录中的 .CLASS 文件,另一边运行测试程序,最后发现在一千多个 CLASS 文件中,只有一个是必不可少的,该文件是: Split分割,正则表达式 JAVA还没学完 要求做课设,高手帮帮忙 使用JAVA制作教务管理管理软件用什么SWING控件? for循环 关于java函数操作的问题 怎样用java写个国际象棋棋盘 程序最小化时间长了,起来就会有一段时间没有反应,该怎么办? javax.servlet 包在什么地方 请大家帮忙告诉我这个函数的作用!!! 萌新求教,查询获取不到数据 请问java中API中有二叉树的类么? 高分求教,我把一个image对象打成了int[],但是我怎么把这个int[]再专成image呢!?
package UnZip;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
import java.util.zip.*;
import java.util.*;
import java.io.*;
public class UnZipFile {
static final int BUFFER = 2048;
public static void main(String[] args) {
ZipFile zipFile;
BufferedOutputStream dest = null;
BufferedInputStream is = null; try
{
zipFile = new ZipFile("F:\\DoctorFundProject\\java°æ\\Merlia_Trial_2.01.zip");
//System.out.println("³É¹¦´´½¨");
//System.out.println(zipFile.size());
Enumeration e = zipFile.entries();
for (; e.hasMoreElements(); ) {
ZipEntry zipEntry = (ZipEntry)e.nextElement();
if (!zipEntry.isDirectory()) {
String filename = new String(zipEntry.getName().getBytes("gb2312"),
"ISO-8859-1");
System.out.println(filename + zipEntry.getName());
System.out.println("Extracting: " + zipEntry.getName());
is = new BufferedInputStream(zipFile.getInputStream(zipEntry)); //System.err.println("is.available::"+is.available());
int count;
byte data[] = new byte[BUFFER];
//File file = new File();
String path = "e:\\zipfile";
String str = zipEntry.getName();
String FileSeparator = System.getProperty("file.separator");
String[] result = ToolKit.split(str, "/");
//System.out.println(result.length);
for (int i = 0; i < result.length - 1; i++) {
path = path + "\\" + result[i];
//System.out.println(result[i]);
}
System.out.println(path);
/*if(str.indexOf("/"))
{
System.out.println("´æÔÚ/");
}*/
File file = new File(path);
if (!file.exists()) {
if (file.mkdirs()) {
System.out.println("Ŀ¼³É¹¦´´½¨");
}
}
path += "\\";
FileOutputStream fos = new FileOutputStream(path +
result[result.length - 1]);
dest = new BufferedOutputStream(fos, BUFFER); while ( (count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
is.close();
}
}
}
catch(ZipException zipe)
{
System.out.println(zipe.getMessage());
zipe.printStackTrace();
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
ioe.printStackTrace();
} }
}
package UnZip;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
import java.util.zip.*;
import java.util.*;
import java.io.*;
public class UnZipFile {
static final int BUFFER = 2048;
public static void main(String[] args) {
ZipFile zipFile;
BufferedOutputStream dest = null;
BufferedInputStream is = null; try
{
zipFile = new ZipFile("F:\\DoctorFundProject\\java°æ\\Merlia_Trial_2.01.zip");
//System.out.println("³É¹¦´´½¨");
//System.out.println(zipFile.size());
Enumeration e = zipFile.entries();
for (; e.hasMoreElements(); ) {
ZipEntry zipEntry = (ZipEntry)e.nextElement();
if (!zipEntry.isDirectory()) {
String filename = new String(zipEntry.getName().getBytes("gb2312"),
"ISO-8859-1");
System.out.println(filename + zipEntry.getName());
System.out.println("Extracting: " + zipEntry.getName());
is = new BufferedInputStream(zipFile.getInputStream(zipEntry)); //System.err.println("is.available::"+is.available());
int count;
byte data[] = new byte[BUFFER];
//File file = new File();
String path = "e:\\zipfile";
String str = zipEntry.getName();
String FileSeparator = System.getProperty("file.separator");
String[] result = ToolKit.split(str, "/");
//System.out.println(result.length);
for (int i = 0; i < result.length - 1; i++) {
path = path + "\\" + result[i];
//System.out.println(result[i]);
}
System.out.println(path);
/*if(str.indexOf("/"))
{
System.out.println("´æÔÚ/");
}*/
File file = new File(path);
if (!file.exists()) {
if (file.mkdirs()) {
System.out.println("Ŀ¼³É¹¦´´½¨");
}
}
path += "\\";
FileOutputStream fos = new FileOutputStream(path +
result[result.length - 1]);
dest = new BufferedOutputStream(fos, BUFFER); while ( (count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
is.close();
}
}
}
catch(ZipException zipe)
{
System.out.println(zipe.getMessage());
zipe.printStackTrace();
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
ioe.printStackTrace();
} }
}
package UnZip;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
import java.util.zip.*;
import java.util.*;
import java.io.*;
public class UnZipFile {
static final int BUFFER = 2048;
public static void main(String[] args) {
ZipFile zipFile;
BufferedOutputStream dest = null;
BufferedInputStream is = null; try
{
zipFile = new ZipFile("F:\\DoctorFundProject\\java°æ\\Merlia_Trial_2.01.zip");
//System.out.println("³É¹¦´´½¨");
//System.out.println(zipFile.size());
Enumeration e = zipFile.entries();
for (; e.hasMoreElements(); ) {
ZipEntry zipEntry = (ZipEntry)e.nextElement();
if (!zipEntry.isDirectory()) {
String filename = new String(zipEntry.getName().getBytes("gb2312"),
"ISO-8859-1");
System.out.println(filename + zipEntry.getName());
System.out.println("Extracting: " + zipEntry.getName());
is = new BufferedInputStream(zipFile.getInputStream(zipEntry)); //System.err.println("is.available::"+is.available());
int count;
byte data[] = new byte[BUFFER];
//File file = new File();
String path = "e:\\zipfile";
String str = zipEntry.getName();
String FileSeparator = System.getProperty("file.separator");
String[] result = ToolKit.split(str, "/");
//System.out.println(result.length);
for (int i = 0; i < result.length - 1; i++) {
path = path + "\\" + result[i];
//System.out.println(result[i]);
}
System.out.println(path);
/*if(str.indexOf("/"))
{
System.out.println("´æÔÚ/");
}*/
File file = new File(path);
if (!file.exists()) {
if (file.mkdirs()) {
System.out.println("Ŀ¼³É¹¦´´½¨");
}
}
path += "\\";
FileOutputStream fos = new FileOutputStream(path +
result[result.length - 1]);
dest = new BufferedOutputStream(fos, BUFFER); while ( (count = is.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
is.close();
}
}
}
catch(ZipException zipe)
{
System.out.println(zipe.getMessage());
zipe.printStackTrace();
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
ioe.printStackTrace();
} }
}
当中的ToolKit这个类是哪儿的?
你把你贴出来的这段代码编译一下吧,好象通不过的.
是不是缺了什么东西?
你是不是用了什么开发工具?
你把你的代码copy倒notepad,然后编译试试,通不过.
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/public class ToolKit {
public static String[] split(String str, String div, boolean isRegular) {
String result[] = null; //返回结果集合
String substr; if (str == null || div == null) {
return (null);
} if ((str = str.trim()).length() == 0)
return (new String[]{str}); int cur = 0,
cnt = 0,
prv = cur,
end; while (cur < str.length()) { if ((end = str.indexOf(div, cur)) < 0) {
end = str.length();
} substr = str.substring(cur, end);
if (isRegular) {
cnt += stringCount(substr, "(");
cnt -= stringCount(substr, ")");
}
if (isRegular == false || cnt == 0 || end == str.length()) {
substr = str.substring(prv, end);
if (result == null) {
result = new String[]{new String(substr)};
} else {
int len = result.length;
String array[] = new String[len + 1]; for (int i = 0; i < len; i++)
array[i] = result[i]; result = array; result[len] = new String(substr);
}
}
cur = end + div.length();
if (isRegular == false || cnt == 0)
prv = cur;
}
return (result);
}
private static int stringCount(String str, String div) {
int cnt = 0;
int pos = 0;
while ((pos = str.indexOf(div, pos)) >= 0) {
pos += div.length();
cnt++;
}
return cnt;
}
public static String[] split(String str, String div) {
return split(str, div, false);
}
public static void main(String[] args) {
}
}
String filename = new String(zipEntry.getName().getBytes("gb2312"),"ISO-8859-1");
还有处理字符串的那个类ToolKit,是针对什么编码格式的.
在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题。一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java 语言默认的编码方式是UNICODE ,而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编码的常识入手,结合 Java 编程实例,分析以上两个问题并提出解决它们的方案。
-------------------------------------------------------------------------------- 现在 Java 编程语言已经广泛应用于互联网世界,早在 Sun 公司开发 Java 语言的时候,就已经考虑到对非英文字符的支持了。Sun 公司公布的 Java 运行环境(JRE)本身就分英文版和国际版,但只有国际版才支持非英文字符。不过在 Java 编程语言的应用中,对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样完美,因为中文字符集不只一个,而且不同的操作系统对中文字符的支持也不尽相同,所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们。有很多关于这些问题的解答,但都比较琐碎,并不能够满足大家迫切解决问题的愿望,关于 Java 中文问题的系统研究并不多,本文从汉字编码常识出发,分析 Java 中文问题,希望对大家解决这个问题有所帮助。 汉字编码的常识 我们知道,英文字符一般是以一个字节来表示的,最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符,而汉字成千上万,所以现在都以双字节来表示汉字,为了能够与英文字符分开,每个字节的最高位一定为1,这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等。关于具体编码方式的详细资料,有兴趣的读者可以查阅相关资料。我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码,中华人民共和国国家标准汉字信息交换用编码,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆地区及新加坡,简称国标码。两个字节中,第一个字节(高字节)的值为区号值加32(20H),第二个字节(低字节)的值为位号值加32(20H),用这两个值来表示一个汉字的编码。UNICODE 码是微软提出的解决多国字符问题的多字节等长编码,它对英文字符采取前面加“0”字节的策略实现等长兼容。如 “A” 的 ASCII 码为0x41,UNICODE 就为0x00,0x41。利用特殊的工具各种编码之间可以互相转换。 Java 中文问题的初步认识 我们基于 Java 编程语言进行应用开发时,不可避免地要处理中文。Java 编程语言默认的编码方式是 UNICODE,而我们通常使用的数据库及文件都是基于 GB2312 编码的,我们经常碰到这样的情况:浏览基于 JSP 技术的网站看到的是乱码,文件打开后看到的也是乱码,被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。 String sEnglish = “apple”; String sChinese = “苹果”; String s = “苹果 apple ”; sEnglish 的长度是5,sChinese的长度是4,而 s 默认的长度是14。对于 sEnglish来说, Java 中的各个类都支持得非常好,肯定能够正确显示。但对于 sChinese 和 s 来说,虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持(默认 UNICODE 编码),但是如果操作系统的默认编码不是 UNICODE ,而是国标码等。从 Java 源代码到得到正确的结果,要经过 “Java 源代码-> Java 字节码-> ;虚拟机->操作系统->显示设备”的过程。在上述过程中的每一步骤,我们都必须正确地处理汉字的编码,才能够使最终的显示结果正确。 “ Java 源代码-> Java 字节码”,标准的 Java 编译器 javac 使用的字符集是系统默认的字符集,比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1,所以大家会发现在 Linux 操作系统上编译的类中源文件中的中文字符都出了问题,解决的办法就是在编译的时候添加 encoding 参数,这样才能够与平台无关。用法是 javac –encoding GBK。 “ Java 字节码->虚拟机->操作系统”, Java 运行环境 (JRE) 分英文版和国际版,但只有国际版才支持非英文字符。 Java 开发工具包 (JDK) 肯定支持多国字符,但并非所有的计算机用户都安装了 JDK 。很多操作系统及应用软件为了能够更好的支持 Java ,都内嵌了 JRE 的国际版本,为自己支持多国字符提供了方便。 “操作系统->显示设备”,对于汉字来说,操作系统必须支持并能够显示它。英文操作系统如果不搭配特殊的应用软件的话,是肯定不能够显示中文的。 还有一个问题,就是在 Java 编程过程中,对中文字符进行正确的编码转换。例如,向网页输出中文字符串的时候,不论你是用 out.println(string); // string 是含中文的字符串 还是用 <%=string%>,都必须作 UNICODE 到 GBK 的转换,或者手动,或者自动。在 JSP 1.0中,可以定义输出字符集,从而实现内码的自动转换。用法是 <%@page ContentType=”text/html;charset=gb2312” %> 但是在一些 JSP 版本中并没有提供对输出字符集的支持,(例如 JSP 0.92),这就需要手动编码输出了,方法非常多。最常用的方法是 String s1 = request.getParameter(“keyword”); String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”); getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组,而“GBK” 是目标编码方式。我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 ,经过上述转换过程,在支持 GBK 字符集
JDK1.15
Vcafe2.0
JPadPro 服务器端
NT IIS
Sybase System
Jconnect(JDBC) 客户端
IE5.0
Pwin98 .CLASS 文件存放在服务器端,由客户端的浏览器运行 APPLET , APPLET 只起调入 FRAME 类等主程序的作用。界面包括 Textfield ,TextArea,List,Choice 等。 I. 取中文 用 JDBC 执行 SELECT 语句从服务器端读取数据(中文)后,将数据用 APPEND 方法加到 TextArea(TA) ,不能正确显示。但加到 List 中时,大部分汉字却可正确显示。 将数据按“ISO-8859-1” 编码方式转化为字节数组,再按系统缺省编码方式 (Default Character Encoding) 转化为 STRING ,即可在 TA 和 List 中正确显示。 程序段如下: dbstr2 = results.getString(1); //After reading the result from DB server,converting it to string. dbbyte1 = dbstr2.getBytes(“iso-8859-1”); dbstr1 = new String(dbbyte1); 在转换字符串时不采用系统默认编码方式,而直接采用“ GBK” 或者 “GB2312” ,在 A 和 B 两种情况下,从数据库取数据都没有问题。 II. 写中文到数据库 处理方式与“取中文”相逆,先将 SQL 语句按系统缺省编码方式转化为字节数组,再按“ISO-8859-1”编码方式转化为 STRING ,最后送去执行,则中文信息可正确写入数据库。 程序段如下: sqlstmt = tf_input.getText(); //Before sending statement to DB server,converting it to sql statement. dbbyte1 = sqlstmt.getBytes(); sqlstmt = newString(dbbyte1,”iso-8859-1”); _stmt = _con.createStatement(); _stmt.executeUpdate(sqlstmt); …… 问题:如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时(称为 A 情况),上述程序代码可正确执行。但是如果客户机只有浏览器,而没有 JDK 和 CLASSPATH 时(称为 B 情况),则汉字无法正确转换。 我们的分析: 1.经过测试,在 A 情况下,程序运行时系统的缺省编码方式为 GBK 或者 GB2312 。在 B 情况下,程序启动时浏览器的 JAVA 控制台中出现如下错误信息: Can't find resource for sun.awt.windows.awtLocalization_zh_CN 然后系统的缺省编码方式为“8859-1”。 2.如果在转换字符串时不采用系统缺省编码方式,而是直接采用 “GBK” 或“GB2312”,则在 A 情况下程序仍然可正常运行,在 B 情况下,系统出现错误: UnsupportedEncodingException。 3.在客户机上,把 JDK 的 CLASSES.ZIP 解压后,放在另一个目录中, CLASSPATH 只包含该目录。然后一边逐步删除该目录中的 .CLASS 文件,另一边运行测试程序,最后发现在一千多个 CLASS 文件中,只有一个是必不可少的,该文件是: