java字符串以及字符类型基础
介绍一下java字符集和字符的编码方式,
首先要区分一下字符集和字符编码.所谓的字符集 类似于unicode,GB2312,GBK,ASCII等等.因为一开始只有26个英文字母需要
编一下号.所有用下ASCII就够了,但是随着计算机的发展,有更多的文字需要在计算机中进行表现,包括拉丁文,日文,中文等等,因此各国有发展了
各自国家文字的字符集. 然后为了统一地球,把所有国家的文字集中起来,发展了unicode(废话很多)
unicode一开始是用2个字节(16位)对应一个符号.这跟java中一个char类型的变量所占用的字节数是相等的,没什么问题.但是后来unicode升级了
扩展到了20位(扩展为0x0000-0x10ffff),这样,一个char有时候就不能对应到一个unicode字符集中的一个符号了.
所以就用2个char来表示一个大于0xffff的数值在unicode字符集中所对应的符号.(假设说从0x0000-0xffff个数,每一个对应一个符号,都可以用一个char来表示,
那么,数字0x10ff00所对应的符号就必须用2个char来表示,假设0x10ff00直接用2个char也就是32位来表示,即表示为0x0010,0xff00,但是当读取到0x0010时候,如何判断这个数字是代表0x0010在unicode字符集中对应的一个符号,还是表示0x10ff00数字的高16位,所以我们需要一种编码方式来解决这种歧义.所以这就是编码方式的作用之一)
在java中char类型集采用的是utf-16的编码方式.下面就对utf-16编码方式进行一下介绍.
先介绍一下几个名词: 1.代码点(code point): 表示的是某个字符在unicode字符集中所对应的编号. 比如字符 'A' 对应的代码点(code point)就是0x0041
2. 代码单元(code unit): 规定16位的存储容量就是一个代码单元.
Unicode代码点可以分成17个代码级别(code plane)。第一个代码级别称为基本的多语言级别(basic multilingual plane),代码点从0x0000到0xFFFF,其中包括了经典的Uncode代码;其余16个附加级别,代码点从0x10000带0x10FFFF,其中包括了一些辅助字符(supplementary character)。
Unicode字符集基本平面BMP中的字符(从0x0000到0xFFFF,但必须除开0xD800~0xDFFF这一在Unicode字符集BMP中称之为代理码点的部分(空闲部分) 0xD800到0xDBFF用于第一个代码单元,0xDC00到0xDFFF用于第二个代码单元),仍然是直接映射关系,亦即这部分字符的字符编号与字符编码是等同的。
而在编码0x10000~0x10FFFF区间内的字符,则用2个代码单元标识.且每个代码单元的值都落在了0xD800-0xDFFF区间内(这样就不会发生歧义)
假设字符X(未知数)的编码在0xFFFF之外,那么字符X有2个代码单元 —— W1和W2。其中W1=110110yyyyyyyyyy(0xD800-0xDBFF),W2 = 110111xxxxxxxxxx(0xDC00-OxDFFF)。然后,将X的高10位分配给W1的低10位,将X的低10位分配给W2的低10位。这样就可以将20bits的代码点X拆成两个16bits的代码单元。而且这两个代码点正好落在替代区域0xD800-0xDFFF中。
具体举个例子:代码点0x1D56B(一个整数集的算术符号Z)
0x1D56B= 0001 1101 0101 0110 1011
将0x1D56B的高10位0001 1101 01分配给W1的低10位组合成110110 0001 1101 01=0xD875
将0x1D56B的低10位01 0110 1011分配给W2的低10位组合成110111 01 0110 1011=0xDD6B
这样代码点0x1D56B采用UTF-16编码方式,用2个连续的代码单元0xD875和0xDD68表示出了。
由于String内部使用的是char[]来表示字符串,所以String类也使用utf-16编码方式存储字符.
所以我们使用Strinig类的CharAt(index)方法时要多加小心, 返回的char可能落在区间0xD800-0xDFFF中(如果字符串中含有除基本多语言级别之外的字符)
还有一些比如length()方法,只是返回底层char数组的长度,并非实际字符的个数.(当然还有其他一些方法,需要多注意).
参考:https://zhuanlan.zhihu.com/p/27417641
http://blog.csdn.net/fhx19900918/article/details/8135019
java字符串以及字符类型基础的更多相关文章
- java字符串和时间类型的相互转换
整理的时间正则可能不全 /****** * * 是以"-" 为分隔符的 * * * * ******/ // 2012-12-03 04:07:34 reg = "\\d ...
- java 字符串,字符数组,list间的转化
1.关于java.lang.string.split xxx.split()方法可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.字符串转字符数组 String str =" ...
- Delphi XE7中各种字符串与字符类型的内存结构
1. ShortString 类型 定义:type ShortString = string[255]; 内存结构与大小:ShortString 是每个字符为单字节的字符串.ShortString 的 ...
- python 判断字符串中字符类型的常用方法
s为字符串 s.isalnum() 所有字符都是数字或者字母 s.isalpha() 所有字符都是字母 s.isdigit() 所有字符都是数字 s.islower() 所有字符都是小写 s.isup ...
- java字符串转为Map类型:split()方法的应用
方法一: package com.thinkgem.jeesite.modules.socketTest.demo2; import java.util.HashMap; import java.ut ...
- java字符串转换数值类型出现异常赋予默认值
http://blog.csdn.net/w47_csdn/article/details/77855126 可以自定义工具方法,例如: public static int parseInt(Stri ...
- 循环遍历Java字符串字符的规范方法——类似python for ch in string
比如我将string作为CNN 文本处理输入: float [] input = new float[maxLength]; // 1 sentence by maxLenWords // int[] ...
- 5.Swift教程翻译系列——Swift字符串和字符
英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 字符串是一组字符的有序序列,比方"hello,china"或 ...
- The Swift Programming Language-官方教程精译Swift(4)字符串和字符
String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 ...
随机推荐
- python_利用高阶函数实现剪枝函数
案例: 某些时候,我们想要为多个函数,添加某种功能,比如计时统计,记录日志,缓存运算结果等等 需求: 在每个函数中不需要添加完全相同的代码 如何解决? 把相同的代码抽调出来,定义成装饰器 求斐波那契数 ...
- scrapy_xpath
什么是xpath? 路径表达式 在xml和html中进行导航 包含标准函数库 遵循w3c标准 xpth节点关系是什么? 父节点 子节点 兄弟节点 先辈节点 后代节点 xpth语法 a ...
- CSS深入理解学习笔记之relative
1.relative和absolute的相煎关系 限制作用:①限制left/top/right/bottom定位:②限制z-index层级:③限制在overflow下的嚣张气焰. relative和f ...
- javabean内省
何为JavaBean? JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共 ...
- Java为什么需要保留基本数据类型
基本数据类型对以数值计算为主的应用程序来说是必不可少的. 自从1996年Java发布以来,基本数据类型就是Java语言的一部分.John Moore通过对使用基本类型和不使用基本类型做java基准测试 ...
- 设置PATH和CLASSPATH
每天玩java的,如果连这门语言背景一点都熟悉的话,说出去真的是挺丢人的一件事情. 首先,java具有最强大的2个特点:功能强大,简单易用.出去android不说,这门语言衍生出太多的开源框架了,这也 ...
- Linux平台ORACLE INSTANT客户端安装
下载安装文件 先去ORACLE官方网站下载所需版本的Instant Client Package 和 Instant Client Package - SQL*Plus安装包,(千万注意版本) htt ...
- Android 使用android-support-multidex解决Dex超出方法数的限制问题
随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: UNEXPECTED TOP-LE ...
- mysql导出数据至指定文件的命令
根据查询语句,导出数据至指定文件SELECT name INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY '-|-' OPTIONALLY ENC ...
- 探索从 MVC 到 MVVM + Flux 架构模式的转变
本文首发于 my blog 在业务中一般 MVVM 框架一般都会配合上数据状态库(redux, mobx 等)一起使用,本文会通过一个小 demo 来讲述为什么会引人数据状态库. 从 MVC 到 MV ...