文档章节

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

 独行侠
发布于 2016/04/14 16:08
字数 1241
阅读 43
收藏 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
eclipse控制台乱码的解决方法

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

霞女
2015/11/25
99
0
mac myeclipse console乱码

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

jinceon
2014/02/26
1K
1
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

没有更多内容

加载失败,请刷新页面

加载更多

Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
22分钟前
1
0
ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
3
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
2
0
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public v......

go4it
昨天
6
0
CentOS 生产环境配置

初始配置 对于一般配置来说,不需要安装 epel-release 仓库,本文主要在于希望跟随 RHEL 的配置流程,紧跟红帽公司对于服务器的配置说明。 # yum update 安装 centos-release-scl # yum ins...

clin003
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部