字符在utf-8,gbk,gb2312,iso8859-1下的编码实验
下面这个代码的功能是,获取某个字符或汉字在utf-8,gbk,gb2312,iso8859-1等下的十六进制,八进制,十进制,二进制的表示(当然,只有二进制才是其在计算机中的真真表示.)
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下的编码实验相关推荐
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- 计算机ucs汉字编码,字符编码基础知识 - Unicode,UCS,GBK,GB2312,UTF-8
字符编码基础知识- Unicode,UCS,GBK,GB2312,UTF-8 最近遇到一个Unicode和UTF-8关系比较的问题,之前在处理中文显示时也遇到过类似的问题,于是花时间学习了一下,在此做 ...
- 字符编码的故事(ASCII ISO GBK GB2312 UTF-8)
转载自:http://yuncode.net/article/a_520afe25b065d13 另有一篇对"UTF-8 GBK UTF8 GB2312 之间的区别和关系"描述比较 ...
- ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别
ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别 最近老为编码问题而烦燥,下定决心一定要将其弄明白!本文主要总 结网上一些朋友提供的 asc ...
- PHP搜索utf和gbk,php中判断是gbk还是utf
// 返回: true - 含GB编码 false - 为UTF-8编码 function is_gb2312($str) { for($i=0; $i $v = ord( $str[$i] ); i ...
- utf-8,gbk,gb2312区别
很多用户问GBK与UTF-8版本有什么区别,这边作了个整理如下: KesionCMS的GBK版本与UTF-8版本功能是一样的.只不过编码方式不同. GBK的文字编码是双字节来表示的,即不论中.英文字符 ...
- UTF-8 GBK GB2312 之间的区别和关系
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...
- urf-8 gbk gb2312之间的关系
UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三 ...
- c语言字符串如何转换成gbk,C语言实现GBK/GB2312/五大码之间的转换(转)
//--------------------------------------------------------------------------- // 大五码Big5转GBK码: void ...
最新文章
- python mqtt tls_python mqtt使用
- windows下编译lua源码
- 江西理工大学c语言程序设计竞赛怎么备考,2015年江西理工大学C语言程序设计竞赛(高级组)...
- VC里的#define new DEBUG_NEW
- 算法入门篇 一 时间复杂度
- LeetCode 1870. 准时到达的列车最小时速(二分查找)
- pycharm无法导入Pillow
- 视频剪辑软件到底哪个功能强?容易上手并且不要钱的?
- 浏览器中json的使用 与jquery无关 json2.js
- 七人表决器VHDL语言
- 使用vbs脚本实现自动化安装GUI程序
- 数据智能、孪生城市——展望未来智慧城市产业发展
- box-sizing的属性
- 腾讯云服务器如何挂载云硬盘(Linux版本)?
- 基于单片机水温自动控制系统设计-毕设课设资料
- ye读春秋左传系列视频讲解
- 2个硬盘离线导致raid崩溃的数据恢复案例
- 快慢指针 ——链表 | Leetcode 练习
- 基于STM32的智能小车方案设计
- 利用TVS及1R电阻保护后级电路