关于编码解码的问题,必须弄清楚!懂的请进!

SelfMedicated 2012-09-20 09:52:07
项目中经常会出现乱码的问题,而我经常不知道修改哪里的编码,要修改成什么编码。
不能在这样下去了,我希望自己遇到乱码问题后,能很清楚哪里的编码不对,马上进行有针对的修改,于是我要弄清楚他的本质。

我提出这样一个问题,作为了解编码的切入口(问题来自:http://kevin-xiaozi.iteye.com/blog/1329740):

从eclipse控制台输入中文,然后将该中文写入到txt文件中,就这样一个动作很容易出现乱码!


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
* 从控制台读入字符串,然后写到文件中,文件和项目编码为UTF-8编码
*
*/
public class EncodeTest {

public static void main(String[] args) throws IOException {
// String s = "你好";
// byte[] b1 = s.getBytes("iso-8859-1"); // 编码
// System.out.println(Arrays.toString(b1));
// String s1 = new String(b1, "GBK"); // 解码
// System.out.println(s1);
readIn();
}

public static void readIn() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in,
"UTF-8"));// 设置控制台读取编码
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("./content.txt"), "GBK"));// 设置写入 txt编码
String s = null;
while ((s = br.readLine()) != null) {
if (s.equals("over")) {
break;
}
bw.write(s);
bw.newLine();
}
bw.flush();
br.close();
bw.close();
}
}


首先我理解的编码和解码的概念是这样的:
把“字符”转化成“字节”叫编码
把“字节”转化成“字符”叫解码

如果没有异议,那么请帮我解释这样一个问题:
键盘输入->控制台->程序->文件,中文在这个过程中经历了哪些编码和解码


下面会有连续几个问题,请帮我解答。

这里需要在几处地方进行编码设置的:
1.右键项目->properties->Resource->Text file encoding //这里的编码是设置该项目中所有java文件中的中文的显示吗?

2.右键项目->Run as->Run configurations->Common->encoding //这里是设置console的编码吗?我为什么需要设置这里的编码呢?

3.txt文件的编码方式。

...全文
272 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
SelfMedicated 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

JAVA使用UNICODE来存储字符数据,处理字符时通常有三个步骤:
- 按指定的字符编码形式,从源输入流中读取字符数据
- 以UNICODE编码形式将字符数据存储在内存中
- 按指定的字符编码形式,将字符数据编码并写入目的输出流中。
所以JAVA处理字符时总是经过了两次编码转换,一次是从指定编码转换为UNICODE编码,一次是从UNICODE编码转换为指……
[/Quote]

那设置控制台的编码是为了什么?
jackin853 2012-09-20
  • 打赏
  • 举报
回复
JAVA使用UNICODE来存储字符数据,处理字符时通常有三个步骤:
- 按指定的字符编码形式,从源输入流中读取字符数据
- 以UNICODE编码形式将字符数据存储在内存中
- 按指定的字符编码形式,将字符数据编码并写入目的输出流中。
所以JAVA处理字符时总是经过了两次编码转换,一次是从指定编码转换为UNICODE编码,一次是从UNICODE编码转换为指定编码。如果在读入时用错误的形式解码字符,则内存存储的是错误的UNICODE字符。而从最初文件中读出的字符数据,到最终在屏幕终端显示这些字符,期间经过了应用程序的多次转换。如果中间某次字符处理,用错误的编码方式解码了从输入流读取的字符数据,或用错误的编码方式将字符写入输出流,则下一个字符数据的接收者就会编解码出错,从而导致最终显示乱码。

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧