文档章节

一段java代码带你认识锟斤拷

polly
 polly
发布于 2017/05/02 10:09
字数 543
阅读 166
收藏 2
@Test
public void testKunJinKao(){
  String str="我不是锟斤拷";
  try {
    byte[] buff=null;

    //让我们先看看几种错误的转换,let's go

    //1. 正常的GBK字节流,你以为是UTF-8,所以用UTF-8去解码...
    buff=str.getBytes("GBK");//这里只要不抛异常,数据一定不会被破坏
    String str1=new String(buff,"UTF-8");
    System.out.println(str1);//这是一种情形:���

    //2. 正常的UTF-8字节流,你以为是GBK,所以用GBK去解码...
    buff=str.getBytes("UTF-8");//这里只要不抛异常,数据一定不会被破坏
    String str2=new String(buff,"GBK");//这里破坏了
    System.out.println(str2);//这是另外一种情形:

    //说了半天,锟斤拷在哪里呢?come on

    //3. 本来正常的GBK字节码,在你不知道的某个环节已经被错误的使用UTF-8解码了
    String str3=new String(str.getBytes("GBK"),"UTF-8");
    String str4=new String(str3.getBytes("UTF-8"),"GBK");//这里你并不知道数据已经破坏了,这样用是对的。
    System.out.println(str4);//锟斤拷

    /**
     * Got it.How are you,nice to meet you.
     *
     * Why?
     * 如果说情形1、2是开发者自己造成的,
     * 那么情形3往往是开发者被坑了,别人造成的(也可能是容器层),总之你拿到的时候已经乱了。
     */

    /**
     * 细心的你会发现,正是情形1的错误,导致了情形3的发生。之所以表现不同,是因为情形1的程序猿是在UTF-8下打印输出;
     * 而情形3是在GBK下打印输出。
     */

    /**
     * 总结一下,锟斤拷是怎么产生的?
     *
     * 源于GBK字符集和Unicode字符集之间的转换问题。
     * Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,
     * Unicode官方用了一个占位符(REPLACEMENT CHARACTER)来表示这些文字,这就是:U+FFFD
     *
     * U+FFFD的UTF-8编码出来,恰好是 '\xef\xbf\xbd'。
     *
     * 重复多次,例如 '\xef\xbf\xbd\xef\xbf\xbd',
     * 然后放到GBK/CP936/GB2312/GB18030的环境中显示的话,
     * 一个汉字2个字节,最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。
     */
  } catch (Exception e) {
    e.printStackTrace();
  }


}

© 著作权归作者所有

polly

polly

粉丝 158
博文 66
码字总数 76732
作品 0
海淀
架构师
私信 提问
new String(str.getBytes("iso8859-1"), "UTF-8");

1.编码基础知识 最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。 1.1. iso8859-1 通常叫做Latin-1 属于单字节编码,最...

八戒_o
2015/11/09
0
0
再再谈java乱码:GBK和UTF-8互转尾部乱码问题分析(续)

在《再谈java乱码:GBK和UTF-8互转尾部乱码问题分析》我们分析了,如果从一个UTF-8 的字节序列,经过 的操作,"可能"(与总字节数有关)会破坏数据。结果可能是,损失最后一个"字"。 反过来呢?...

polly
2017/10/25
0
0
myeclipse 9.0 安装phpeclipse插件

安装myeclipse 9.0 的phpeclipse插件,我是先下了phpeclipse压缩包,然后解压后复制features和plugins两文件夹到myeclipse的安装目录下,在我新建的myplugins文件夹下建了php文件下,并运行了...

路边拾草人
2011/05/31
3.4K
0
python3中文url解码“锟斤拷”问题

我直接举例说明了,有个文件名叫 因为网页编码是gbk,而系统默认utf-8,所以在网页上看上去是这样的: 文件下载下来是这样的: 英文都是正常,明显是中文url编码的问题了。 我搜了一会儿发现...

0xfff
2015/12/05
1K
4
Java的痛

转自: OurJS 在2014年,如果一个程序员在命令行中运行一段简单的程序变得非常困难,那么这就是不正常的。 我写了些代码去连接 Keybase 和 OpenKeychain, 本计划写更多。因为这是一个Android...

Kris_zcl
2014/06/26
431
3

没有更多内容

加载失败,请刷新页面

加载更多

我的Linux系统开始学习的过程

Linux系统,不知大家是否了解。接触计算机不多或对计算机不感冒的人可能对其比较陌生,曾经的我也是。上大学前的我的确对Linux一无所知,那时候接触面窄,都没有听说过此名字,上了大学后,身...

xiangyunyan
19分钟前
1
0
第三讲:验证码点击刷新

前面两讲里面的验证码是无法通过点击刷新的,只能通过刷新页面进行验证码的刷新。有时候我们生成的验证码比较复杂导致用户看不清的时候,用户可以通过点击验证码图片的方式进行验证码的刷新。...

一匹狼工作室
21分钟前
14
0
Iqueryable.skip问题

int[] grades = { 1, 2, 3, 4, 5, 6, 7, 8 };// 59, 82, 70, 56, 92, 98, 85 }; int rd = grades.Length; var iqg = grades.AsQueryable().OrderBy((q)=>q); ......

whoisliang
22分钟前
2
0
nginx常见报错

nginx默认上传的请求体最大为1M,通过设置client_max_body_size即可修改:

城市之雾
23分钟前
2
0
springcloud服务网关Zuul高级篇 学习记录-纯洁的微笑

之前已经集成了网关,并且已经抽离优化成一个服务,现在看他的高级部分。Zuul还有更多的应用场景,比如:鉴权、流量转发、请求统计等等,这些功能都可以使用Zuul来实现。 1.鉴权-自定义Filte...

夜中孤影
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部