ASCII 码

学过计算机的人都知道 ASCII 码。总共同拥有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等。32~126 是打印字符。能够通过键盘输入并且能够显示出来。这128个符号(包括32个不能打印出来的控制符号),仅仅占用了一个字节的后面7位,最前面的1位统一规定为0。ISO-8859-1

128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15。当中 ISO-8859-1 涵盖了大多数西欧语言字符,全部应用的最广泛。ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。GB2312

它的全称是《信息交换用汉字编码字符集 基本集》。它是双字节编码,总的编码范围是 A1-F7,当中从 A1-A9 是符号区,总共包括 682 个符号,从 B0-F7 是汉字区,包括 6763 个汉字。GBK

全称叫《汉字内码扩展规范》。是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,增加很多其它的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共同拥有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字能够用 GBK 来解码,并且不会有乱码。UTF-16

说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典。世界上全部的语言都能够通过这本字典来相互翻译。

可想而知这个字典是多么的复杂,关于 Unicode 的具体规范能够參考相应文档。

Unicode 是 Java 和 XML 的基础,以下具体介绍 Unicode 在计算机中的存储形式。须要注意的是,Unicode仅仅是一个符号集,它仅仅规定了符号的二进制代码,却没有规定这个二进制代码应该怎样存储。

比方,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101)。也就是说这个符号的表示至少须要2个字节。表示其它更大的符号,可能须要3个字节或者4个字节。甚至很多其它。

UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式。这个是定长的表示方法,任何字符都能够用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便。每两个字节表示一个字符,这个在字符串操作时就大大简化了操作。这也是 Java 以 UTF-16 作为内存的字符存储格式的一个非常重要的原因。UTF-8

UTF-16 统一採用两个字节表示一个字符,尽管在表示上非常easy方便,可是也有其缺点,有非常大一部分字符用一个字节就能够表示的如今要两个字节表示,存储空间放大了一倍,在如今的网络带宽还非常有限的今天。这样会增大网络传输的流量,并且也不是必需。而 UTF-8 採用了一种变长技术,每个编码区域有不同的字码长度。

不同类型的字符能够是由 1~6 个字节组成。

UTF-8 有以下编码规则:

假设一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。

可见。全部 ASCII 编码已经是 UTF-8 了。

假设一个字节。以 11 开头,连续的 1 的个数暗示这个字符的字节数,比如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。

反复一遍,这里的关系是,UTF-8是Unicode的实现方式之中的一个。

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式(十六进制) | (二进制)

--------------------+---------------------------------------------

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

在 Java 开发中除了 I/O 涉及到编码外。最经常使用的应该就是在内存中进行字符到字节的数据类型的转换。

上面介绍了常见的编码格式,以下结合样例看看java中编解码方式:

我们一汉字“严”为例进行測试。

public class LengthTest {

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

String name = "严";

byte[] utf8 = name.getBytes("UTF-8");

System.out.println(utf8.length);

System.out.print("UTF8:");toHex(utf8);

byte[] gbk = name.getBytes("GBK");

System.out.print("GBK:");toHex(gbk);

String unicodeStr =Integer.toHexString("严".charAt(0) );

System.out.println("unicode:"+unicodeStr); //

//unicode转汉字

StringBuffer sb = new StringBuffer();

String str[] = unicodeStr.toUpperCase().split("U");

for(int i=0;i

if(str[i].equals("")) continue;

char c = (char)Integer.parseInt(str[i].trim(),16);

sb.append(c);

}

System.out.println(sb.toString());

}

public static void toHex(byte[] b) {

for (int i = 0; i < b.length; i++) {

System.out.printf("%x " , b[i]);

}

System.out.println();

}

}

我们把 name 字符串依照前面说的几种编码格式进行编码转化成 byte 数组,然后以 16 进制输出,我们先看一下 Java 是怎样进行编码的。

java 一个汉字等于几个空格_java梳理-一个汉字占多大空间相关推荐

  1. java 用户线程如何修改界面内容_java 加入一个线程、创建有响应的用户界面 。 示例代码...

    javajava 加入一个线程.创建有响应的用户界面 . 示例代码 来自thinking in java 4 21章 部分代码 目录21.2.11 package org.rui.thread.con ...

  2. java中不等于空怎么写_JAVA判断不等于空的情况

    判断不等于空的情况,千万不要搞混淆. if(orderId != null && !"".equals(orderId))  中间不是||的关系,是&&am ...

  3. java 遍历出d盘所有文件_JAVA遍历一个文件夹中的所有文件

    JAVA遍历一个文件夹中的所有文件 在实际项目中给定一文件夹,得到这个文件夹下所有的文件这样的需求并不是很多,更多的是查找或是删除某一具体的文件 import java.io.File; import ...

  4. java语言的三个版本是_Java是一个全面且功能强大的语言,可用于多种用途。Java有三个版本分别是:_学小易找答案...

    [单选题]电路如图所示,电路中包含的网孔个数为( ). [单选题]各点电位的高低是()的,而两点之间的电压值是()的. [单选题]研究发现,影响睡眠障碍的生物学因素与非生物学因素(). [单选题]1 ...

  5. java一个类添加多个接口_Java的一个类可以实现多个接口。

    Java的一个类可以实现多个接口. 答:√ 下列原始凭证中属于一次凭证的有( ). 答: 收据 收料单 完全角化细胞在显微镜下不可能出现的颜色是 答:白色 In a language classroo ...

  6. java中怎么让一个数倒转_java 输入一个数字,反转输出这个数字的值(实现方法)

    java 输入一个数字,反转输出这个数字的值(实现方法) 如下所示: package 第四天; import java.util.Scanner; public class 数字反转 { public ...

  7. Java建造圆判断是否在园内_java – 查找一个圆圈是否在另一个圆圈内

    我有点麻烦我有一个任务,要求我找到一个第二个圆是否重叠,内部或第二个圈子.但是,我无法检查重叠,如果第二个圆圈在第一个圆圈内. (使用的变量是x1,x2,y1,y2,r1,r2,distance) 这 ...

  8. java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...

    java基础(2)--运算符详解 自增自减规则 自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一:后者是后缀式,先加一,在赋值给a;而且a++,++a并不 ...

  9. java的max函数比较三个数_java – 使用泛型创建返回较大函数的max函数

    在Java中,我如何使用泛型来创建一个max函数,该函数将两个相同类型的Comparable对象作为参数并返回较大的对象? 我试过了: public static T max(T obj1, T ob ...

最新文章

  1. QCon2016旧金山大会焦点分享者确认
  2. Exchange Server 2010 全新部署篇八:CASHUB中集线器配置部分
  3. JUC并发编程八 并发架构--park,unpark
  4. Anaconda python3.6版本下载
  5. php面试题接口方面,php面试题6 - osc_xb4v1nhl的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 全面支持3.0 新华三“力夯”可信计算发展
  7. hdu4417(Super Mario)—— 二分+划分树
  8. webRTC之智能指针std::unique_ptr::reset()使用(十四)
  9. 将ClearCase的客户端编码设置为UTF-8
  10. 萌新卷妹带你逃出算法无名岛第六站
  11. TPS54231DR IC REG BUCK ADJUSTABLE 2A 8SOIC
  12. JAVA中implement和extends的区别?
  13. 关于LCD1602单独清除某一行的问题
  14. 最新版谷歌浏览器更新后下载时奔溃
  15. 求频率的公式是什么计算机,cpu时钟频率计算公式_CPU频率计算方法详解
  16. C语言编程笔试题(一)
  17. 主流相机镜头分析与代表作
  18. 亚马逊AWS学习——多网络接口下配置EC2实例连接公网的一个“bug”
  19. plupload上传文件碰到的问题
  20. 史上最全的免费开源ERP Odoo14产品档案设置应用教程

热门文章

  1. Java设计模式之单例模式--静态内部类
  2. leetcode206
  3. AI语音技能云开发(天猫精灵技能)学习笔记之一
  4. 获取nacos配置中心文件值_09-Nacos配置中心(读取配置文件)
  5. 初识运算放大器(跟随器,比较器,同向/反向放大器,差分放大器,微分器,积分器)
  6. Activity和Fragment生命周期变化
  7. 闲谈 vue-strap 框架的 vselect 使用方法
  8. 猎头操作过程及技巧--ZT
  9. 论文解读:《自适应非局部随机游动用于图像超像素分割》
  10. 《信息管理学基础》——娄策群(第二版)第二章答案