java字符串以及字符类型基础

one777 2018-03-02 原文

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

发表于 2018-03-02 17:41 无名的怪物 阅读() 评论() 编辑 收藏

 

版权声明:本文为one777原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/one777/p/8494414.html

java字符串以及字符类型基础的更多相关文章

  1. 手写一个最简单的IOC容器,从而了解spring的核心原理

    从事开发工作多年,spring源码没有特意去看过。但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正 […]...

  2. Java 类的继承详解

    /*文章中用到的代码只是一部分,需要完整代码的可通过邮箱联系我1978702969@qq.com*/ 在面向对 […]...

  3. 深入理解 Java 线程池

    一、简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任 […]...

  4. Java Web之网上购物系统(注册、登录、浏览商品、添加购物车) – kang_ya_ping

    Java Web之网上购物系统(注册、登录、浏览商品、添加购物车) 眼看就要期末了,我的专业课也迎来了第二次的 […]...

  5. 再有人问你Netty是什么,就把这篇文章发给他

    前言 本文基于Netty4.1展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大 […]...

  6. java Eclipse的使用技巧

    eclipse与myeclipse的关系(都属于java开发的工具): 后者是前者的一个插件,后来为了方便使用 […]...

  7. Java 添加、读取、删除Excel形状

    本文介绍通过java程序在excel中操作形状(图形)的方法,包括: 1. 添加形状(如设置形状类型/位置/大 […]...

  8. JVM内存模型与垃圾回收

    一、JVM体系结构 二、JVM Heap Memory 1.新生代(Young Generation)  &# […]...

随机推荐

  1. 查看sqlserver的端口号

    背景   这几天想写一个使用java连接sqlserver的数据库连接测试程序。但是在查看数据库连接字符格式以 […]...

  2. 【Flutter 实战】pubspec.yaml 配置文件详解

    【Flutter 实战】pubspec.yaml 配置文件详解 老孟导读:pubspec.yaml 文件是 F […]...

  3. 在线博客转PDF电子书 | JS爬虫初探

    最近在看一位大佬写的源码解析博客,平时上下班用手机看不太得劲,但是平板又没有网卡,所以就想搞个离线pdf版,方 […]...

  4. C语言中的回调函数(Callback Function) – jontian

    C语言中的回调函数(Callback Function) 1 定义和使用场合 回调函数是指 使用者自己定义一个 […]...

  5. docker日常使用指南

    docker日常使用指南 目录 docker日常使用指南 前言 1.基础知识 1.1 docker是什么 1. […]...

  6. ftp实现普通账号和vip账号限速

      ftp工作流程: ftp回话包含了两个通道,控制通道和数据通道,ftp的工作有两种模式,一种是主动模式,一 […]...

  7. Java–泛型理解和使用 (List list = new ArrayList(); )

    List<String> list = new ArrayList<String>() […]...

  8. esp8266烧录Html文件,实现内置网页控制设备! – demo例子集

    esp8266烧录Html文件,实现内置网页控制设备! 这个月也快结束了,时间真快,我服务器知识自学依然在路途 […]...

展开目录

目录导航