一直以来对编码并不是太理解,所以用java做了个实验,感觉清楚了点:
下面这个代码的功能是,获取某个字符或汉字在utf-8,gbk,gb2312,iso8859-1等下的十六进制,八进制,十进制,二进制的表示(当然,只有二进制才是其在计算机中的真真表示.)

import java.io.UnsupportedEncodingException;

public class CharEncode {
  /**
    * @param str
    *                        字符
    * @param charsetName
    *                        编码
    * @param debug
    *                        是否调试
    * @throws UnsupportedEncodingException
    */
  public static void displayEncode(String str, String charsetName,
      boolean debug) throws UnsupportedEncodingException {
    System.out.println("----------------------------------");
    byte[] bytes = str.getBytes(charsetName);
    int bytes_length = bytes.length;

System.out.println("字符:" + str + "\t编码:" + charsetName + "\t共占用"
        + bytes_length + "bytes(字节)," + bytes_length * 8
        + "bit(位)\t每个字节的情况如下:");
    for (int i = 0; i < bytes_length; i++) {

System.out.print("bytes[" + i + "]的十进制为:" + bytes[i]);// 获取byte字节

Integer int_byte = (int) bytes[i];// 强制转化为int,应为bytes只占8bit,而int占32bit所以个人认为万无一失.

String binaryString = Integer.toBinaryString(int_byte);// 获取整数的2进制的String表示方式
      String hexString = Integer.toHexString(int_byte);// 获取整数的16进制的String表示方式
      String octalString = Integer.toOctalString(int_byte);// 获取整数的16进制的String表示方式
      if (debug) {
        System.out.print("\t对应的十进制为:" + int_byte);
        System.out.print("\t对应整数的二进制为:" + binaryString);
        System.out.print("\t对应整数的八进制为:" + octalString);
        System.out.print("\t对应整数的十六进制为:" + hexString);
      }

/** **八进制格式显示* */
      int octalString_length = octalString.length();
      System.out.print("\t八进制为:"
          + octalString.substring(octalString_length - 2,
              octalString_length));
      /** **十六进制格式显示* */
      int hexString_length = hexString.length();
      System.out.print("\t十六进制为:"
          + hexString.substring(hexString_length - 2,
              hexString_length));

/** **为了方便阅读,将二进制以每4位一组的格式显示* */

// 不足8位的,在前段加"0"补齐
      while (binaryString.length() < 8) {
        binaryString = "0" + binaryString;
      }
      int binaryString_length = binaryString.length();

String first = binaryString.substring(binaryString_length - 8,
          binaryString_length - 4);// 取前4位
      String second = binaryString.substring(binaryString_length - 4,
          binaryString_length);// 取后4位

System.out.println("\t二进制为:" + first + " " + second);

}
    System.out.println();
  }

public static void main(String[] args) throws UnsupportedEncodingException {

// 通过UltraEdit知道: 汉字"我"在gbk编码下的十六进制是"ced2";

boolean debug = false;
    String str = "";
    String utf_8 = "utf-8";
    String gbk = "gbk";
    String gb2312 = "gb2312";
    String iso8859_1 = "iso8859-1";

str = "我";
    System.out.println("*****************" + str + "*******************\n");
    displayEncode(str, utf_8, debug);
    displayEncode(str, gbk, debug);
    displayEncode(str, gb2312, debug);
    displayEncode(str, iso8859_1, debug);

str = "A";
    System.out.println("*****************" + str + "*******************\n");
    displayEncode(str, utf_8, debug);
    displayEncode(str, gbk, debug);
    displayEncode(str, gb2312, debug);
    displayEncode(str, iso8859_1, debug);

str = "1";
    System.out.println("*****************" + str + "*******************\n");
    displayEncode(str, utf_8, debug);

}
}

实验结果如下:
*****************我*******************

----------------------------------
字符:我    编码:utf-8    共占用3bytes(字节),24bit(位)    每个字节的情况如下:
bytes[0]的十进制为:-26      八进制为:46    十六进制为:e6    二进制为:1110 0110
bytes[1]的十进制为:-120    八进制为:10    十六进制为:88    二进制为:1000 1000
bytes[2]的十进制为:-111    八进制为:21    十六进制为:91    二进制为:1001 0001

----------------------------------
字符:我    编码:gbk    共占用2bytes(字节),16bit(位)    每个字节的情况如下:
bytes[0]的十进制为:-50    八进制为:16    十六进制为:ce    二进制为:1100 1110
bytes[1]的十进制为:-46    八进制为:22    十六进制为:d2    二进制为:1101 0010

----------------------------------
字符:我    编码:gb2312    共占用2bytes(字节),16bit(位)    每个字节的情况如下:
bytes[0]的十进制为:-50    八进制为:16    十六进制为:ce    二进制为:1100 1110
bytes[1]的十进制为:-46    八进制为:22    十六进制为:d2    二进制为:1101 0010

----------------------------------
字符:我    编码:iso8859-1    共占用1bytes(字节),8bit(位)    每个字节的情况如下:
bytes[0]的十进制为:63    八进制为:77    十六进制为:3f    二进制为:0011 1111  (查ASSCII码表可得"?",常见的乱码,呵呵,但为什么先取得是这个二进制呢??????)

*****************A*******************

----------------------------------
字符:A    编码:utf-8    共占用1bytes(字节),8bit(位)    每个字节的情况如下:
bytes[0]的十进制为:65    八进制为:01    十六进制为:41    二进制为:0100 0001

----------------------------------
字符:A    编码:gbk    共占用1bytes(字节),8bit(位)    每个字节的情况如下:
bytes[0]的十进制为:65    八进制为:01    十六进制为:41    二进制为:0100 0001

----------------------------------
字符:A    编码:gb2312    共占用1bytes(字节),8bit(位)    每个字节的情况如下:
bytes[0]的十进制为:65    八进制为:01    十六进制为:41    二进制为:0100 0001

----------------------------------
字符:A    编码:iso8859-1    共占用1bytes(字节),8bit(位)    每个字节的情况如下:
bytes[0]的十进制为:65    八进制为:01    十六进制为:41    二进制为:0100 0001

*****************1*******************

----------------------------------
字符:1    编码:utf-8    共占用1bytes(字节),8bit(位)    每个字节的情况如下:
bytes[0]的十进制为:49    八进制为:61    十六进制为:31    二进制为:0011 0001

从中可以看出汉字在utf-8编码下,占用3个字节,GBK,gb2312占用2个字节,用iso8859-1只能取出一个字节(造成乱码的原因之一)
另外getBytes(charsetName);方法很强劲啊,回头想看看源代码,呵呵

转载于:https://blog.51cto.com/sunfish/142577

字符在utf-8,gbk,gb2312,iso8859-1下的编码实验相关推荐

  1. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  2. 计算机ucs汉字编码,字符编码基础知识 - Unicode,UCS,GBK,GB2312,UTF-8

    字符编码基础知识- Unicode,UCS,GBK,GB2312,UTF-8 最近遇到一个Unicode和UTF-8关系比较的问题,之前在处理中文显示时也遇到过类似的问题,于是花时间学习了一下,在此做 ...

  3. 字符编码的故事(ASCII ISO GBK GB2312 UTF-8)

    转载自:http://yuncode.net/article/a_520afe25b065d13 另有一篇对"UTF-8 GBK UTF8 GB2312 之间的区别和关系"描述比较 ...

  4. ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别

    ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别 最近老为编码问题而烦燥,下定决心一定要将其弄明白!本文主要总 结网上一些朋友提供的 asc ...

  5. PHP搜索utf和gbk,php中判断是gbk还是utf

    // 返回: true - 含GB编码 false - 为UTF-8编码 function is_gb2312($str) { for($i=0; $i $v = ord( $str[$i] ); i ...

  6. utf-8,gbk,gb2312区别

    很多用户问GBK与UTF-8版本有什么区别,这边作了个整理如下: KesionCMS的GBK版本与UTF-8版本功能是一样的.只不过编码方式不同. GBK的文字编码是双字节来表示的,即不论中.英文字符 ...

  7. UTF-8 GBK GB2312 之间的区别和关系

    UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...

  8. urf-8 gbk gb2312之间的关系

    UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...

  9. c语言字符串如何转换成gbk,C语言实现GBK/GB2312/五大码之间的转换(转)

    //--------------------------------------------------------------------------- // 大五码Big5转GBK码: void ...

最新文章

  1. python mqtt tls_python mqtt使用
  2. windows下编译lua源码
  3. 江西理工大学c语言程序设计竞赛怎么备考,2015年江西理工大学C语言程序设计竞赛(高级组)...
  4. VC里的#define new DEBUG_NEW
  5. 算法入门篇 一 时间复杂度
  6. LeetCode 1870. 准时到达的列车最小时速(二分查找)
  7. pycharm无法导入Pillow
  8. 视频剪辑软件到底哪个功能强?容易上手并且不要钱的?
  9. 浏览器中json的使用 与jquery无关 json2.js
  10. 七人表决器VHDL语言
  11. 使用vbs脚本实现自动化安装GUI程序
  12. 数据智能、孪生城市——展望未来智慧城市产业发展
  13. box-sizing的属性
  14. 腾讯云服务器如何挂载云硬盘(Linux版本)?
  15. 基于单片机水温自动控制系统设计-毕设课设资料
  16. ye读春秋左传系列视频讲解
  17. 2个硬盘离线导致raid崩溃的数据恢复案例
  18. 快慢指针 ——链表 | Leetcode 练习
  19. 基于STM32的智能小车方案设计
  20. 利用TVS及1R电阻保护后级电路

热门文章

  1. “六神”——技术提高开发效率的一个方案
  2. half extents
  3. 模拟简单计算器及比较大小
  4. L4,C16:差1墩,从张数最多的套上去找
  5. Linux下防御/减轻DDOS***的方法
  6. linux查看内核版本、系统版本、系统位数(32/64)
  7. 智能DNS解析+JBOSS集群(一)
  8. jQuery on()方法
  9. Struts2 Result详解
  10. Android 监听ScrollView的滑动