ok,今天搞了一天都在探索java字符的编码问题.十分头疼.最后终于得出几点:

  1.网上有很多博客说判断一个String的编码的方法是通过如下代码;但其实这个代码完全是错的,用一种编码decode后,再encode,最后的结果是完全一样的.所以下面这个代码,不管用什么编码方式,结果都是true.

  1. String encode = "GB2312";
  2. try {
  3. if (str.equals(new String(str.getBytes(encode), encode))) {
  4. String s = encode;
  5. return s;
  6. }
  7. } catch (Exception exception) {
  8. }
  9. encode = "ISO-8859-1";
  10. try {
  11. if (str.equals(new String(str.getBytes(encode), encode))) {
  12. String s1 = encode;
  13. return s1;
  14. }
  15. } catch (Exception exception1) {
  16. }

  2.接下来我要说一下我通过实验的出来的结论:java String中的编码方式其实是unicode编码,也就是utf-16编码.当然看到网上很多说法说unicode编码和utf-16编码不一样,但是通过在java中的测试,utf-16编码就是unicode编码,测试代码如下;

System.out.println(StandardCharsets.UTF_16.aliases());    //这个的输出结果是:[utf16, UnicodeBig, UTF_16, unicode]
 3.我是怎么得到String中的编码都是unicode编码的:
      首先我看了Charset.encode()和Charset.decode()这俩个方法,这俩个方法其实就是在将数据在特定的编码与unicode编码之间转换:将使用某种特定编码的byte流decode成
unicode编码的char[],那可以想象,这个转换其实是彻底的改变了byte流的数据,也就是直接按照编码之间的映射关系,对byte流直接做了修改.然后decode的原理相同,只是方向相反,将
unicode编码的数据直接修改,转换成了某种特定的编码所编码过后的数据.据此可以判断,java在识别char的时候,其实就是按照unicode的编码方式来识别byte流的.
      再然后我粗略的看了一下String的构造函数还有getBytes函数的源码,当然源码真的十分复杂,看起来很费劲,所以我只是粗略的看了个大概,然后就可以想象其中的原理了.首先在
在构造String的时候,我们传进去了一个特定的Charset,然后看到在构造函数里调用了这个函数的encode方法,对byte[]进行的encode操作,当然,按照上面所说的,encode操作其实就是将某
种特定编码的byte数据转换成了unicode编码的数据.所以说,String中的编码其实全部都是unicode编码.
      然后我看了一下getbytes函数的源码,同样,在这个函数里调用了charset的decode方法,将String中的char[]转换成了特定编码的byte[].那这也进一步证明了String中的数据
确实是由unicode编码编码的.
4.最后把这个原理用在实践中有什么用处呢.当我们从外部读入数据时,不管是读文件还是从网络流中读数据,当然如果直接按数据流一样读入后,读入的数据还保持着原来的编码方式,但如果我
们想把数据放入char[]中打印出来或进行字符处理的话,就会出错.所以要想进行字符操作,就要指定数据源的编码类型,然后将数据重新进行编码.
5.如何输出特定编码方式的数据.其实这个很简单,如果我们的处理后的数据的编码方式就是我们想要的编码方式的话,直接输出就好了.但如果不是的话,可以先把它转成unicode编码,然后再
转成我们想要的编码的byte[]流,然后直接输出去.在转换编码的时候,不建议直接使用Charset中的decode和encode,因为返回的buffer往往都比实际的数据要大,根据源码,我看到在返回buffer
的时候,并没有对buffer进行trim操作.建议使用String的getBytes方法.通过看源码,发现在源码中有trim的操作.长度是通过decode来返回的.decode的具体实现还没有
看完.

关于java中的编码问题的更多相关文章

  1. 理清Java中的编码解码转换

    1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...

  2. java中的编码和编码格式问题

    看来问的人和回答的人都不一定清楚什么是“编码和编码格式”,以及如何理解“java中字符串的编码”;首先明确几点: unicode是一种“编码”,所谓编码就是一个编号(数字)到字符的一种映射关系,就仅仅 ...

  3. java基础---->java中字符编码问题(一)

    这里面对java中的字符编码做一个总结,毕竟在项目中会经常遇到这个问题.爱不爱都可以,我怎样都依你,连借口我都帮你寻. 文件的编码格式 一.关于中文的二进制字节问题 public static Str ...

  4. JAVA中的编码分析

    在实际编程中可以不用关注JVM中使用的是什么编码,而只需要关注自己输出需要采用的编码,JVM会根据你设置的编码正确操作. 1.String采用的是什么编码? 很多厂家根据规范实现了JVM,JVM只说明 ...

  5. java中字符串编码转换

    Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...

  6. Java中字符编码和字符串所占字节数 .

    首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...

  7. java 中的编码

    1.1字节=8位,1024字节=1KB2.16进制0x12345678,其二进制为00010010 00110100 01010110 01111000共4字节3.字节序:两个或多个字节存放的先后顺序 ...

  8. 一文解开java中字符串编码的小秘密

    目录 简介 Unicode的发展史 Unicode详解 UTF-8 UTF-16 UTF-32 Null-terminated string 和变种UTF-8 简介 在本文中你将了解到Unicode和 ...

  9. Java中的编码

    package coreJava; import javax.swing.plaf.synth.SynthSpinnerUI; public class EncodeDemo { public sta ...

随机推荐

  1. Spring Cloud之DiscoveryClient使用

    主要修改zk order的代码: package com.toov5.api.controller; import java.util.List; import org.springframework ...

  2. Java -- Swing 组件使用

    1. 示例1 public class Main { JFrame f = new JFrame(); Icon okIcon = new ImageIcon("/home/test/sta ...

  3. HDU 4336 Card Collector:期望dp + 状压

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意: 一共有n种卡片.每买一袋零食,有可能赠送一张卡片,也可能没有. 每一种卡片赠送的概率为p ...

  4. python 正则表达式(一)

    正则表达式(简称RE)本质上可以看作一个小的.高度专业化的编程语言,在Python中可以通过re模块使用它.使用正则表达式,你需要为想要匹配的字符串集合指定一套规则,字符串集合可以包含英文句子.e-m ...

  5. 关于com组件中idl文件的理解

    IDL文件: IDL文件主要定义两大类内容:一是定义接口:二是定义类型库. 定义接口的关键字是interface.每个接口定义前面方括号里面的内容是该接口的属性,最重要的是uuid的定义.该部分经过M ...

  6. 倍增模板orz

    #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #i ...

  7. innerdb disable error

    innodb=OFF ignore-builtin-innodb skip-innodbdefault-storage-engine=myisam default-tmp-storage-engine ...

  8. Sqlite表结构读取工具,word批量转html,在线云剪贴板,文件批量提取工具;

    工欲善其事必先利其器,本周为您推荐工具排行 Sqlite表结构读取工具,word批量转html,在线云剪贴板,文件批量提取工具:     本周我们又要发干货了,准备好接受了吗? 为什么是干货,就是因为 ...

  9. BZOJ2428:[HAOI2006]均分数据

    我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 题目传送门:https://www.lydsy.com/JudgeOnline/probl ...

  10. mysql 用户和存储过程相关命令

    如何显示所有的存储过程?select `name` from mysql.proc where db='db_name' and `type`='procedure';orshow procedure ...