文档章节

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

 独行侠
发布于 2016/04/14 16:08
字数 1241
阅读 37
收藏 0
点赞 1
评论 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

eclipse控制台乱码的解决方法

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

霞女 ⋅ 2015/11/25 ⋅ 0

mac myeclipse console乱码

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

jinceon ⋅ 2014/02/26 ⋅ 1

cmd命令行中logcat输出日志中文乱码

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

塔塔米 ⋅ 2014/01/30 ⋅ 0

DOS命令下使用sqlite3 命令中文乱码的解决办法

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

tianlonn ⋅ 2014/04/11 ⋅ 0

怎么设置koala的eclipse插件

@Koala考拉 你好,想跟你请教个问题:在console中显示出现乱码

草泥马二号 ⋅ 2014/10/30 ⋅ 3

phpstorm奇怪的问题?

告别了越来越臃肿的Eclipse,最近在学习使用JetBrains的IDE(如Intellij idea PhpStorm),感觉界面还是挺不错的,启动运行都很流畅。用惯了Eclipse,好多快捷键都不同了,稍微有点不习惯,但...

iman123 ⋅ 2013/12/20 ⋅ 3

在VScode中改变cmd的编码和字体

在node.js的调试过称中,经常需要在终端中使用console.log()输入一些变量,然而windows的cmd默认是GBK编码,在调试的过程中会出现乱码: 上面的图片中正常输出应该是“你好” 幸好VScode提供...

cloes ⋅ 2016/11/09 ⋅ 0

字符集与编码(六)——getBytes方法及乱码初步

在前一篇里我们谈了Unicode的代码单元及string.length,现在接着前面的讨论继续谈string.getBytes()方法并对乱码的产生作初步分析。 string.getBytes方法 首先声明一下,以下讨论如无特别说明...

国栋 ⋅ 2014/09/12 ⋅ 9

在cmd窗口中显示UTF-8字符

有这么一个文件,它在Eclipse属性中看到是UTF8编码的,里面包含了中文: 但是当在Windows控制台中查看这个文件(为了方便,我将文件拷贝到桌面了)的时候,就是乱码了: C:Users002778Deskt...

独钓渔 ⋅ 2015/11/13 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud构建微服务架构—创建“服务注册中心”

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par......

itcloud ⋅ 刚刚 ⋅ 0

拖动

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>event</title> <style> #box { width: 100px; height: 100px; background-color: aquamarine; position: absolute; } </style......

fyliujj ⋅ 3分钟前 ⋅ 0

es6 polyfill array

polyfill之javascript函数的兼容写法——Array篇 1. Array.isArray(obj) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[objec......

球球 ⋅ 5分钟前 ⋅ 0

kibana启动异常

检查一下:kibana.yml 每一对key:value中,冒号之后应有空格。

增删改查1 ⋅ 7分钟前 ⋅ 0

js修改img的src属性刷新图片时的图片缓存问题

问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过...

HaierBrother ⋅ 7分钟前 ⋅ 0

Mysql

1.Jdbc Url 设置allowMultiQueries为true和false mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。 参数名称 参数说明 缺省...

瑟青豆 ⋅ 10分钟前 ⋅ 0

mysql导出导入表结构与数据

当我们需要进行数据迁移时,mysql自带的mysqldump会是最好的方式。 1.导出某张表的结构和数据 首先,我们应当使用服务器,打开终端,连接到所需要导出的表所在的服务器上。执行命令: mysqld...

hengbao5 ⋅ 10分钟前 ⋅ 0

世界杯也走向“比拼”大数据的时代

《日本经济新闻》6月19日报道称,俄罗斯足球世界杯已于6月14日揭开战幕。作为第21次举办的足球世界杯,如何活用大数据有可能成为决定各支球队胜负的重要因素。从对阵球队的分析到战术建议,还...

加米谷大数据 ⋅ 11分钟前 ⋅ 0

金额转为千分制,金额转中文大写

金额转关为大写 js /** 数字金额大写转换(可以处理整数,小数,负数) */ function digitUppercase(n){ if(!n) reutrn "" let fraction = ['角', '分']; let digit = ['零', '壹', '贰', '叁', ...

YXMBetter ⋅ 14分钟前 ⋅ 0

开发利器JRebel部署SpringBoot项目

不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你。 idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitter登录 勾选 Build project automati...

郑龙飞 ⋅ 19分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部