Java字符编码详解
char
- “字节”是byte,“位”是bit ;
- 1 byte = 8 bit ;
- char 在Java中是2个字节。java采用unicode(《java核心技术卷一》里面有详细说明),2个字节(16位)来表示一个字符。而Unicode编码包括汉字,所以也可以给char赋值汉字。
那么我们在程序中的char =‘\123’和char = ‘\u0023’甚至’\”’这些又是怎么回事呢?
这个需要从计算机的历史说起。
Ascii及中国的编码
既然是程序员,那么大家对Ascii肯定有一定的了解。
Ascii(American Standard Code for Information Interchange),美国信息互换标准代码,官方的ASCII码表如下->AsciiTABLE。
Ascii为八位一个字节,一共可以组合出256(2的8次方)种不同的状态。
一开始美国人把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上00x10, 终端就换行,例好遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。
这些0x20以下的字节状态称为”控制码”。
接着把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。
后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的。他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。
从128到255这一页的字符集被称”扩展字符集”。
等到我们天朝用计算机时发现挖槽你他妈一个位置都没留给我,我还有几千上万个文字要保存呢,于是我们自己创造了两个字节编码的“GB2312”以及之后的同样是两个字节的“GBK”。之后“GBK”扩展为“GB18030”,这些编码标准被通称为 “DBCS”(Double Byte Charecter Set 双字节字符集)。
DBSC系列的标准的最大特点是,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,如果一个字节小于127那么按照Ascii的编码,如果大于127那么其和后面的字符组成一个汉字字符。
然后各国也是按照自己的需求弄了一套自己可用的编码。很愉快大家都能用了,接着发现不对啊,各个国家之间电脑需要交流,你的资源到我这里编程乱码,我的资源你也用不了。
于是。。一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”。
Unicode的字符编码表:来自维基百科的Unicode编码表
对于ascii里的那些“半角”字符(即前面排到128个字符),UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。
Unicode及UTF
UNICODE 是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。UNICODE 如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到UTF时并不是直接的对应,而是要过一些算法和规则来转换。而且网络传输字符编码也涉及到大端小端的问题。
具体可以看如下两篇我觉得不错的文章:
各种编码及Unicode和UTF的转换
字节序是个什么鬼?(大小端)
java中的编码
前面说了,java使用到编码是UNICODE。怎么具体“体会到”这种编码呢?我们可以用java中的转义符 \。
- 一、我们直接使用“\”来转化数字为字符的话,后面的数字应为八进制。
而且只能转化一个字节大小,即255个字符,如下:
八进制转义序列:\ + 八进制数;范围’\000’~’\377’(对应十进制0~255)
\0:空字符
有人问了Unicode不是两个字节吗,为什么这里一个字节就可以,其实java在这里会把它转化为两个字节按Unicode转换。记住是Unicode,不要因为一个字节就以为是ASCII编码,如下代码:
System.out.println('\367'); //这里输出的是 ÷//八进制367转化为10进制为247System.out.println((int) '÷');//输出十进制:247//序号247在Ascii和Unicode对应的字符如下:
Ascii:
Unicode:
- 二、 Unicode转义字符:\u + 4个十六进制数字;对应十进制范围是0~65535
\u0000:空字符
//八进制367对应十六进制00F7,所以下面两个输出都是 ÷System.out.println('\367');System.out.println('\u00F7');System.out.println('\u0000~uFFFF'); //我们电脑出现的每个汉字都包含在这其中
- 三、 特殊字符:就3个
因为在Java中 双引号”、引号’、反斜杆\ 都有特定的含义,双引号要包住字符串,引号要包住字符,反斜杠是转义符,所以我们通过在加一个转义符\让他们真正代表他们自己。
\”:双引号
\’:单引号
\:反斜线
String fieldsNmae = "呵呵";System.out.println("fieldsName:\"" + fieldsNmae + "\"");//不复杂,你就把\"当成字符,输出:fieldsName:"呵呵"
- 四.控制字符:5个
转义符\加固定字符在java中有五个,表示一定的控制操作
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格
System.out.println("开心\n就好");
//输出:
开心
就好
最后要注意,Java是平台无关的,存储默认是大端。而机器用大端还是小端是处理器决定的,跟系统没有关系。
中文的半角和全角
在DBCS系列的编码里面,把连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。所以如果这些例如字母使用一个字节编码就是“半角”,两个字节就是“全角”。其实样子看起来还是有区别的:
半角:abcdefghi
全角:abcdefghi博主是最帅的程序员//可以看出全角字母和中文一样都是占用这相同的空间大小
(unicode里面对这些全角字符也有对应的编码)
Java字符编码详解相关推荐
- java字符编码详解_Java中字符编码格式详解
一.前言 在分析Comparable和Comparator的时候,分析到了String类的compareTo方法,String底层是用char[]数组来存放元素,在比较的时候是比较的两个字符串的字符, ...
- java字符编码详解_java字符编码详解
1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...
- Python2.7字符编码详解
Python2.7字符编码详解 目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3. ...
- 转1:Python字符编码详解
Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...
- 字符编码详解及利用C++ STL string遍历中文字符串
作者:非妃是公主 专栏:<笔记><C++> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文 ...
- Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...
- 字符编码详解及由来(UNICODE,UTF-8,GBK)
字符编码详解及由来(UNICODE,UTF-8,GBK) 各种字符编码方式详解及由来(ANSI,UNICODE,UTF-8,GB2312,GBK) - 2009-01-29 09:53 一直对 ...
- 可能是最详细的字符编码详解
Created By JishuBao on 2019-04-02 12:38:22 Recently revised in 2019-04-03 12:38:22 欢迎大家来到技术宝的掘金世界, ...
- 字符、字符集和字符编码详解(一文扫清疑惑)
前言 字符.字符集和字符编码时常看见,之前也看过一些博文,看得迷迷糊糊地,看过即忘,今天有幸碰到一篇能让我醍醐灌顶的文章,整理一下相关知识点与大家分享! 原博文地址:字符集编码详解(学习,看一篇就够了 ...
最新文章
- 磁盘管理 ——RAID1+0卷+LVM
- 着墨中文lisp登入_Lisp的本质 - climbdream的个人空间 - OSCHINA - 中文开源技术交流社区...
- arggis怎么修改上下标_京东自营是怎么操作的?有什么要求?
- c51为啥要宏定义时钟_51单片机时钟实训报告
- Linux系统安全防护加固
- python抖音表白软件手机版,我喜欢你 抖音表白程序python版
- 微信公众平台开发文档
- linux SD卡驱动
- Python翻译库 pygtrans 谷歌翻译
- 信息检索与搜索引擎:Simhash算法优化
- java中级课程_完整的JAVA中级程序员全面学习路线教程
- [buuctf][Zer0pts2020]easy strcmp
- Java常量池[乐乐独记]
- 美赛BOOM数学建模1-2蒙特卡洛法
- VC加载jpeg, png图片的方法
- div的display和visible的区别
- 每周一学EXCEL函数公式:EXCEL中数值转文本公式TEXT
- 杰理之ANC电路设计注意事项【篇】
- 先进PID控制MATLAB仿真学习记录(一)
- 创业思维 - LeanCloud的故事
热门文章
- HTML5:段落、图片、链接、表格、列表、表单
- 也当一回善男信女 —— 黄大仙古祠烧香记
- 在mysql中如何添加外键约束_如何在MySQL中设置外键约束
- 学习JS的第六天之字符串
- Oracle---启动与关闭数据库实例
- 【日常Exception】第二十二回:构造函数异常Cannot construct instance of `xx.xxx` (no Creators, like default construct
- Serv-U管理密码破解方案?
- ./ 当前目录 ../ 父级目录 / 根目录
- GBase 8s SQL 指南:教程———7修改数据
- WIN11 JAVA环境搭建