解决方案 »
- 零基础菜鸟第一次用JAVA,这些错误求高手解释
- jboss and tomcat -> applet 显示
- 请教一个正则表达式得问题--如何匹配一个重复单个数字多次的字符串
- 关于frame的显示问题:
- 关于逻辑表达式的问题
- 请教这个问题:Exception in thread "main" java.lang.NoClassDefFoundError: a
- 一个恼人的IO问题
- 二叉树的实现赋值不成功
- javax.imageio.ImageIO.read(Unknown Source) .class.getClassLoader().getResource
- 请教事件响应
- webservice客户端调用服务报错
- 线程问题的困惑
比如String a = "我爱中国"
用GBK编码a.getBytes("GBK")不就得到对应的字节数据了你如果把编码过的数据再用GBK解码那当然是同样的字符,如果不是那岂不乱套了?
比如new String(a.getBytes("GBK"), "GBK")当然还是"我爱中国"
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;public class Transfer {
public static void main(String[] args) {
try {
writeUTF8("testTransferUTF8.txt","UTF-8");
File file = new File("testTransferGBK.txt");
file.createNewFile();
transfer();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void transfer() throws Exception{
BufferedReader in = new BufferedReader(
new InputStreamReader(
new BufferedInputStream(
new FileInputStream("testTransferUTF8.txt")), "UTF-8"));
String line;
while((line = in.readLine())!=null){
System.out.println(line.toString());
writeGBK("testTransferGBK.txt","GBK",line);
}
in.close();
}
public static void writeGBK(String fileName,String cha,String content) throws Exception{
PrintWriter out = new PrintWriter(
new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream(fileName,true)), cha));
out.println(content);
out.close();
}
public static void writeUTF8(String fileName,String cha) throws Exception{
PrintWriter out = new PrintWriter(
new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream(fileName)), cha));
out.println("测试第一行");
out.println("测试第二行asdfg");
out.println("测试第三行sasds");
out.println("测试第四行斯蒂芬森");
out.println("测试第五行斯蒂芬森sdf");
out.close();
}
}
简单点说 要把UTF-8 的 "我爱中国" 转成 gbk的 "我爱中国"
把这个字节流发给他就行了
OutputStream out;
PrintWriter writer = new PrintWriter(out);
writer.write("我爱中国");
writer.close();
但问题是PrintWriter和BufferedWriter这样写都是直接使用系统默认编码方式,你的可能是UTF-8,所以就导致你用了错误的编码方式发送字符串。解决方法是,在创建Writer时指定字符集,而PrintWriter和BufferedWriter貌似不支持,所以你要用OutputStreamWriter。
OutputStream out;
OutputStreamWriter writer = new OutputStreamWriter(out, "GBK");
writer.write("我爱中国");
writer.close();
2、把这个字节数组当做GBK编码的数据,转换回字符 // new String(xxx, "gbk")结果是必定乱码
Java String是不存在UTF-8, GBK的
Java的String就是一串文字(当然,底层是Unicode)
只有当String <-----> byte[] 的时候,才会存在编码问题人家说你编码不对,估计你是用了Reader/Writer,你现在应该改用InputStream/OutputStream
区别于Reader/Writer(字符流)读/写的是字符(char, String),Stream对应的是byte,你现在写的时候,把String变成对方要的byte发过去,方法即是outputStream.write(str.getBytes("GBK"));
楼主的那个String变量,不是二进制数据,而是Java对象。
所有的String对象,在Java语言里,都是Unicode编码的。
GBK和UTF-8编码的数据,要看二进制数据,也就是byte数组。
像5楼那样的写法,才算比较靠谱。
编程方面来讲,可以有两种方式:
第一种,面向二进制编程byte[] before = ...;//GBK数据
String data = new String(before,"GBK");
byte[] result = data.getBytes("UTF-8");
第二种,面向字符编程,这个方式是处理大数据时用的,我就不写了。和6楼的意思差不多。