站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题求助!!我连续奋斗五小时也找不出问题所在

求助!!我连续奋斗五小时也找不出问题所在

摘要: 求助!!我连续奋斗五小时也找不出问题所在


这是个将Unicode码转GB2312的问题,如果我直接将/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51作为字符串赋值给temp2一切顺利;但是从文件中读出一行,取其子串再赋值给temp2就不行了,给它什么还是输出什么。我是百思不得其解,请教各位~~~

import java.io.*;
public class code {
public static void main(String[] args) throws IOException {
String filename="E:/elipse/eclipse/applicationresource.txt";
String filename2="E:/elipse/eclipse/application_ch.txt";
String line;
int index,index2;
BufferedReader in=new BufferedReader(new FileReader(filename));
BufferedWriter out=new BufferedWriter(new FileWriter(filename2));
line=in.readLine();
while(line!=null){
index=line.indexOf("=");
String temp=new String(line.substring(index+1, line.length()));
String newline="";
while(true){
index2=temp.indexOf("//u");
if(index2<0)break;
String temp2="//u"+new String(temp.substring(index2+2,index2+6));
byte[] bytesUnicode=temp2.getBytes("GB2312");
String temp3=new String(bytesUnicode,"GB2312");
newline=newline+temp3;
temp=new String(temp.substring(index2+2, temp.length()));
}
System.out.println(newline);
out.write(newline);
out.write("/n");
line=in.readLine();
}
in.close();out.close();
}
}

以下是applicationresource.txt的部分内容
webname=/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51
search.basicsearch_key=/u57fa/u672c/u67e5/u8be2
search.supersearch_key=/u9ad8/u7ea7/u67e5/u8be2
......


怎么不行法?

就这样看的话程序好象是没问题的说...

能把现象说清楚点么?



我也不知道怎么回事
比如读取的文件内容为:
webname=/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51
search.basicsearch_key=/u57fa/u672c/u67e5/u8be2
search.supersearch_key=/u9ad8/u7ea7/u67e5/u8be2
而输出结果是:
/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51
/u57fa/u672c/u67e5/u8be2
/u9ad8/u7ea7/u67e5/u8be2
根本就没有进行转换





你的程序格式太乱了,看起来费力,你再看看这个函数

String temp3=new String(bytesUnicode,"GB2312");
觉得,问题会不会在这个上


那么,zhuixun5506(fgdipx)认为这个语句应该怎么改呢?


我觉得是
byte[] bytesUnicode=temp2.getBytes("GB2312");
并没有做到你想要的效果
它将/u4e2d分成了6个byte,就是byte[] bytesUnicode={92,117,52,101,50,100}
显然不是你想要组成文字的byte[] bytesUnicode={4e,2d}


你没有搞懂各个编码的规范,Uincode到gbk是不兼容的,也就是说用
byte[] bytesUnicode=temp2.getBytes("GB2312");
String temp3=new String(bytesUnicode,"GB2312");
是行不通的。
××××××××××××××××××××××××××××××××
你把你的程序换成以下:
public class Code {
public static void main(String[] args) throws IOException {

String filename = "E:/elipse/eclipse/applicationresource.txt";
String filename2 = "E:/elipse/eclipse/application_ch.txt";
String line;
int index, index2;

BufferedReader in = new BufferedReader(new FileReader(filename));
BufferedWriter out = new BufferedWriter(new FileWriter(filename2));


while ((line = in.readLine()) != null) {
StringBuffer buffer = new StringBuffer();
index = line.indexOf("=");
String temp = new String(line.substring(index + 1, line.length()));
while (temp.indexOf("//u")>=0) {
index2 = temp.indexOf("//u");
String temp2 = new String(temp.substring(index2 + 2, index2 + 6));
char letter = (char) Integer.parseInt(temp2,16);
buffer.append(letter);
temp = new String(temp.substring(index2 + 6, temp.length()));
}
System.out.println(buffer.toString());
out.write(buffer.toString());
out.write("/r/n");
}
in.close();
out.close();
}
}


这里有将/u4e2d转为中文的方法.
http://topic.csdn.net/t/20060112/11/4512351.html

其实是连到http://www.blogjava.net/emu/articles/4773.html

链接上的方法必须要将/u4e2d转为%u4e2d才处理的
/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51转换后是"中国酒店信息网"吧!


我来回答你的问题吧
首先,建议楼主好好理解java编码的原理,给你我的blog,有空看看http://www.blogjava.net/ramon
其次,之所以“直接将/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51作为字符串赋值给temp2一切顺利”是因为,这是String temp2代表7个字符就好像有这样一个String temp2 = "中国酒店信息网";因为/u + 一个16位的数字在java立面代表一个unicode的字符表示,所以你写'/u4e2d'这个和你直接写'中'是一个道理,这样子你再用GB2312的编码对这个字符串进行编码,再进行解码,用同样的编码方式进行编码又解码等于什么都没做,呵呵,所以temp2就正确输出你要的结果拉
再说下你为什么从文件里读入“/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51”而没有正确输出呢,这是因为,你用系统默认的方式读取文件字节流,也刚好你走运,文件的编码和你JVM的编码默认方式一致,所以你正确的从文件里面读入了这样一个字符串
String temp = “/u4e2d/u56fd/u9152/u5e97/u4fe1/u606f/u7f51;
现在明白了吧,你把这样一个字符串,我看你的算法(没仔细看)是把这个字符串没4个4个的读取,然后编码,在解码,本来也没问题,错就错在你用"//u"替换了"/u","/u"在java里专门表示一个unicode编码,而"//u"两个"/"再加u则表示一个"/u"这样一个字符串(估计你本来想这么写String temp2="/u"+new String(temp.substring(index2+2,index2+6));
但是发现编译报错,才写"//u",纯属个人猜测),所以你最后获得的字符串应该是这个样子
String finalStr = "//u4e2d//u56fd//u9152//u5e97//u4fe1//u606f//u7f51";
这样两个“/”一个u表示“/u”这样一个字符串,没有任何转义的含义,所以最后打印出来的结果就是你文件是什么,输出是什么,呵呵
明白了吧


感谢rain_z提供的代码;感谢kenees的分析,您的blog一定仔细阅读。本人学习java才一个月,今后还请各位多多帮助!!


↑返回目录
前一篇: 初学者请教一个JAVA简单问题,关于坐标Point的问题
后一篇: 有什么类或哪位有代码可以将秒直接换算成几天几小时几分钟吗