文档章节

乱码之一 eclipse console 和 xp console 乱码 全程详解(三)

 独行侠
发布于 2016/04/14 16:08
字数 1241
阅读 41
收藏 0

先简单的对我在第一部分提到的三种编码说明一下:

1)iso8859-1,单字节的编码,在0-255之间的字节.

2)gbk 汉字内码扩展规范,兼容gb2312是一种双字节编码。即对于每个字符,都用两个字节来表示。

3)utf-8  是UNICODE的一种变长字符编码又称万国码。

iso8859-1是单字节编码,但是对于超过0-255的不能编码
unicode是一种定长双字节编码,是一种国际通用编码,但是其缺点是,即使是对于一个字母或者一个简单的数据,也要用一个双字节,比较的浪费空间
而utf-8是一种变长编码,即将unicode的值分为多部分,并按照每个部分按照一定的模板转为多个字节,形成utf-8,所以汉字也可以保存为utf-8

gbk是一个内码,在国际化编码中,是尽量不使用的.

尽管汉字不能直接转为iso8859-1但是,我们可以先将汉字转为utf-8(通常是三字节)然后可以再转为iso8859-1,这样子是没有问题的

以上三个的转换关系,尤其是uicode,utf-8之间的转换,网上有很多资料可以查.

中文可以被保存并传输,而不丢失数据的编码就是我们常见的(UTF系列我统称为UTF-8)和GBK了,所以对于一个有中文存在(java  code source file中有中文)的项目,通常使用这两种编码,而且最好是使用UTF-8

当一个项目使用了某种charset的时候,eclipse保存的java code source file 是以这种编码保存的,然后在编译的时候也是用这种编码保存的。所以推荐大家通常项目编码使用UTF-8

下面再代码说明一下读写中文的编码解码问题:

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class WriteFile {
    public static void main(String[] args) throws Exception{
        String chineseChar="汉";
        FileOutputStream fs=new FileOutputStream("d:\\utf8.txt");
        OutputStreamWriter ow=new OutputStreamWriter(fs, "UTF-8");
        ow.write(chineseChar);
        ow.flush();
        ow.close();
    }
}

代码说明:将"汉"以UTF-8编码并保存到utf8.txt这个文件中。(保存之后,可以用十六进制软件打开看到,数据与在第一部分所说的编码是一致的,即里面                      的数据是"汉"的UTF-8编码)

                 你也可以将上面的编码改为GBK,运行程序,保存数据,用十六进制软件打开也是正确的(里面的数据是“汉”的GBK编码)

读文件:


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class ReadFile {
    public static void main(String[] args) throws Exception{
        FileInputStream fs=new FileInputStream("d:\\utf8.txt");
        InputStreamReader ir=new InputStreamReader(fs, "UTF-8");
        BufferedReader br=new BufferedReader(ir);
        String str=br.readLine();
        System.out.println(str);
    }

}

上面的charset为UTF-8,即使用UTF-8对读入的数据进行解码,之后再将其转为unicode存入内存,变量 str指向它.

如果上面读取的文件保存时选择的编码不是UTF-8(比如将上面写文件时编码设置为gbk),则在console输出时,即会出现乱码.

这个过程

"汉"(unicode)--编码并写文件(encode)-->文件--读取并解码(decode)-->字符串(unicode)

在encode与decode时的charset如果不一致时就出现乱码,在两段代码中,如果不指定charset那么java将使用DefaultCharset,就有可能出现乱码



乱码的一个简单的检测办法:

因为java在内在中保存的字符串,都是unicode编码的,所以如果一个String显示的正确的,那么其toCharArray方法得到的char的int值,是一个unicode,可以在网上找一下,这个unicode对应的字符,肯定是显示的那个字符。

如果一个String的unicode不对,那么要想正确的显示出来,则肯定要进行转码,才能输出到console(这里我没有提到console的编码了,当然了,肯定是与unicode编码一致的encoding,一般是utf-8了)。


一个字符串,是这样子生成的

1)从char[]chs,使用new String(chs)生成,;此时java就是假设这个char[]chs是一个unicode的。

比如我们常见的人民币符号¥,其对应的unicode是0xA5,转为十进制就是165,char[]chs=new char[]{165};System.out.println(new String(chs));

就可以输出¥了.

2)更常见的方式是,从外部获得的数据,然后转为字符串,再显示,这个时候,其转换格式则是:

binary---DefaultCharset(encoding)--->String---DefaultCharset(decoding)--->binary----Eclipse Console Charset(encoding)--->显示


除非你在读取外部资源,比如数据库,网络,文件的时候指定了格式。


即:如果一个字符串,其在内存中的unicode如果是正确的,要保证defaultCharset和EclipseConsole一致,并且对于你要显示的字符是兼容的,才不会出现乱码.


© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 19
码字总数 9797
作品 0
成都
DOS命令的一些技巧总结(大纲)

1.设置dos启动的默认路径 安全模式登录(开机启动按F8),依次右键单击我的电脑--管理--本地用户和组-用户--administrator--配置文件--本地路径--输入“C:WINDOWSsystem32”,这样我们就能使...

述而不作
2012/02/29
0
0
mac myeclipse console乱码

现象一:直接执行tomcat的startup.sh,日志里无乱码,正常显示中文。 现象二:在Myeclipse里以java application方式执行文件,console打印出来的中文也是正常的。 现象三,即问题: 在myecl...

jinceon
2014/02/26
1K
1
eclipse控制台乱码的解决方法

乱码!Eclipse 的控制台console必须用GBK编码。 Eclipse 的控制台必须用GBK编码。所以条件1和条件4必须同时满足否则运行的还是乱码。才能保证不是乱码。 条件1,Window | Preferences | Work...

霞女
2015/11/25
99
0
cmd命令行中logcat输出日志中文乱码

http://www.6san.com/913/ 在命令行使用adb logcat命令直接输出日志中文内容显示乱码,原因是中文系统中cmd命令行窗口默认的编码是GBK,而LogCat打印的日志是UTF-8编码,所以adb logcat命令输...

塔塔米
2014/01/30
0
0
DOS命令下使用sqlite3 命令中文乱码的解决办法

1、退出dos 或者重新开启在CMD窗口,输下:chcp 65001 然后回车确定 注意 65001 是Unicode (UTF-8) 65001 的编码设置,Chinese Simplified (GB2312) 的设置为936 ,可以从EditPlus 工具的菜单...

tianlonn
2014/04/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

实战讲解高并发和秒杀抢购系统设计

互联网特别是电商平台,阿里双11秒杀、还有12306春运抢票、以及平时各种节假日抢购活动等,都是典型的高并发场景。 这类场景最大的特征就是活动周期短,瞬间流量大(高并发),大量的人短期涌...

xtof
30分钟前
0
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
33分钟前
6
0
在Ubuntu安装和配置Sphinx

Ubuntu系统默认是配置有sphinx的,先检查一下,别多此一举。。。。。 在开始本指南之前,您需要: 一个Ubuntu 16.04服务器。 sudo的一个非root用户,您可以通过以下设置本教程 。 安装在服务...

阿锋zxf
42分钟前
1
0
Qt编写输入法V2018超级终结版

对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需...

飞扬青云
53分钟前
2
0
TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部