Java字符编码、码点与代码单元_字符编码单元-程序员宅基地

技术标签: java  # Java基础  后端  

一、字符编码

1、Unicode

Unicode万国码国际码统一码单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。

Unicode 为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF (十六进制),有 110 多万,每个字符都有一个唯一的 Unicode 编号,这个编号一般写成 16 进制,在前面加上 U+。例如:“马”的 Unicode 是U+9A6C。Unicode 就相当于一张表,建立了字符与编号之间的联系。

所以Unicode**本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。**因此才有了多种字符编码的存储方案,比较常见就是国际通用字符编码utf-8。

2、utf-8、utf-16和utf-32区别

UTF-32是一种定长编码,使用1个32bit的码元,其值与Unicode编码值相等

UTF-16也是一种变长编码,对于一个Unicode字符被编码成1至2个码元,每个码元为16位。在基本多语言平面内的码位UTF-16编码使用1个码元且其值与Unicode是相等的(不需要转换),但在辅助平面内的码位在UTF-16中被编码为一对16bit的码元(即32bit,4字节)

UTF-8是一种变长编码,对于一个Unicode的字符被编码成1至4个字节。Unicode编码与UTF-8的编码的对应关系:

Unicode编码 UTF-8编码(二进制)
U+0000 – U+007F 0xxxxxxx
U+0080 – U+07FF 110xxxxx 10xxxxxx
U+0800 – U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

一个字节的uft8表示的unicode 码范围为(0 ~0x7F)
两个字节长度的uft8 表示的unicode码范围为(0x80 ~ 0x07FF)
三个字节长度的uft8 表示的unicode码范围为(0x0800 ~ 0xFFFF)
四个字节长度的uft8 表示的unicode码范围为( 0x10000 ~ 0x10FFFF)

二、码点和代码单元

1、码点和代码单元

Java中char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元,最常用的Unicode字符使用一个代码单元就可以表示,而辅助字符则需要一对代码单元表示。

通俗理解是有些Unicode字符可以用一个char值表示,表示一个码点,一个代码单元;但另外的Unicode字符则需要两个char值来表示,即辅助字符需要用两个char值,但表示一个码点,两个代码单元。

2、实战理解

字符串中如果有一些非常规字符的话,使用charAt会导致结果不正确

public class Test {
    
    public static void main(String[] args) {
    
        String test="Hello";
        System.out.println(test);
        System.out.println(test.length());//得到的是代码单元的数量7, 占两个代码单元
        System.out.println(test.codePointCount(0,test.length()));//得到的是码点的数量6

        System.out.println((int)test.charAt(2));//返回第三个的代码单元:得到H的int型

        int index=test.offsetByCodePoints(0,1);//得到第二个码点位置
        int cp=test.codePointAt(index);//得到该位置码点int型表示
        System.out.println(cp);
    }
}

3、遍历字符串

对于无非常规字符的字符串,我们可以使用charAt来遍历(代码单元遍历);而对于非常规字符的字符串,我们就只能遍历码点来实现

public class Test {
    
    public static void main(String[] args) {
    
    // 也可以实现反向遍历
    // if(Character.isSurrogate(test.charAt((i)))) i--;
       String test = "Hello";
        for (int i = 0; i < test.length(); ) {
    
            int cp = test.codePointAt(i);
            if (Character.isSupplementaryCodePoint(cp)) i += 2;
            else i++;
            System.out.print((char) cp);
        }
    }
}

第二种方法

public class Test {
    
    public static void main(String[] args) {
    
        String test="Hello";
        int [] codePoints=test.codePoints().toArray();
        for(int i=0;i<codePoints.length;i++){
    
            System.out.println((char)codePoints[i]);
        }
        //将码点数组转换成字符串
        String str=new String(codePoints,0,codePoints.length);
        //Hello
        System.out.println(str);
    }
}

《Java核心技术卷一》

https://blog.csdn.net/hongsong673150343/article/details/88584753

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lemon_TT/article/details/122197511

智能推荐

dell服务器uefi启动不了系统安装系统安装,新版戴尔bios设置UEFI引导的方法-程序员宅基地

文章浏览阅读2.2w次,点赞5次,收藏38次。新版新版戴尔大部分已经不支持传统引导了,因此如果有用户用传统模式安装的话容易导致安装失败。下面小编就给大家介绍下新版戴尔bios设置UEFI引导的方法。戴尔开启UEFI模式注意事项1、UEFI+GPT安装系统只适用于64位系统2、UEFI模式开启后分区形式需要采用GPT分区,我们可以用Diskgenius分区工具快速分区时选择GUID(GPT)分区3、UEFI模式在安装win7时注意开启"兼容模式..._dell装uefi系统bios设置

【人工智能初学】人工智能学习体验感悟,初学必看全局把握!!!(自己的一点小见解+应用体验<语音,图画,文本等应用>)_人工智能学习感想-程序员宅基地

文章浏览阅读150次。人工智能的研究一般是以知识表示,知识的获取和知识的应用为归依。虽然不同的学科致力于发现不同领域的知识,但我们应该承认所有学科都是为了发现知识为目标,而人工智能希望发现可以不受领域限制,适用于任何领域的知识,包括知识表示,知识获取以及知识应用的一般规律,算法和实现方式等。但大多数人只是浅尝辄止的知道人工智能很厉害可以使计算机或者计算机控制的机器人代替部分简单的工作,知道一些生活中的兴起的事务与人工智能这门学科息息相关,但并没有系统性的了解过人工智能,所以今天在这里我们来浅聊人工智能。_人工智能学习感想

linux devkmem 源码,linux dev/mem dev/kmem实现访问物理/虚拟内存-程序员宅基地

文章浏览阅读451次。dev/mem: 物理内存的全镜像。可以用来访问物理内存。/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。调试嵌入式Linux内核时,可能需要查看某个内核变量的值。/dev/kmem正好提供了访问内核虚拟内存的途径。现在的内核大都默认禁用了/dev/kmem,打开的方法是在 make menuconfig中选中 device drivers --> ..._dev/mem 源码实现

vxe-table 小众但功能齐全的vue表格组件-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏19次。vxe-table,一个小众但功能齐全并支持excel操作的vue表格组件_vxe-table

(开发)bable - es6转码-程序员宅基地

文章浏览阅读62次。参考:http://www.ruanyifeng.com/blog/2016/01/babel.htmlBabelBabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行// 转码前input.map(item => item + 1);// 转码后input.map(function (item) { return item..._让开发环境支持bable

FPGA 视频处理 FIFO 的典型应用_fpga 频分复用 视频-程序员宅基地

文章浏览阅读2.8k次,点赞6次,收藏29次。摘要:FPGA视频处理FIFO的典型应用,视频输入FIFO的作用,视频输出FIFO的作用,视频数据跨时钟域FIFO,视频缩放FIFO的作用_fpga 频分复用 视频

随便推点

宜兴市计算机中等学校,重磅!江苏省陶都中等专业学校正式揭牌!-程序员宅基地

文章浏览阅读559次。原标题:重磅!江苏省陶都中等专业学校正式揭牌! 昨天下午,江苏省陶都中等专业学校揭牌仪式在原丁蜀中专举行。原来的丁蜀中专、和桥中专、张渚中专三校资源,整合成江苏省陶都中等专业学校,施行“一校三区”的办学格局。整合后,原来的三校分别为:陶都中专丁蜀校区、陶都中专和桥校区、陶都中专张渚校区,分处三镇。 新诞生的省陶都中专有哪些亮点?今后将如何发展?小兴带你一探究竟!据了解,目前学校共有全日制学历教..._宜兴电大和陶都中等专业学校哪个好

【蓝桥杯省赛真题39】python输出最大的数 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏8次。第十三届蓝桥杯青少年组python编程省赛真题一、题目要求(注:input()输入函数的括号中不允许添加任何信息)1、编程实现给定一个正整数N,输出正整数N中各数位最大的那个数字。例如:N=132,则输出3。2、输入输出输入描述:只有一行,输入一个正整数N输出描述:只有一行,输出正整数N中各数位最大的那个数字输入样例:

网络协议的三要素-程序员宅基地

文章浏览阅读2.2k次。一个网络协议主要由以下三个要素组成:1.语法数据与控制信息的结构或格式,包括数据的组织方式、编码方式、信号电平的表示方式等。2.语义即需要发出何种控制信息,完成何种动作,以及做出何种应答,以实现数据交换的协调和差错处理。3.时序即事件实现顺序的详细说明,以实现速率匹配和排序。不完整理解:语法表示长什么样,语义表示能干什么,时序表示排序。转载于:https://blog.51cto.com/98..._网络协议三要素csdn

The Log: What every software engineer should know about real-time data's unifying abstraction-程序员宅基地

文章浏览阅读153次。主要的思想,将所有的系统都可以看作两部分,真正的数据log系统和各种各样的query engine所有的一致性由log系统来保证,其他各种query engine不需要考虑一致性,安全性,只需要不停的从log系统来同步数据,如果数据丢失或crash可以从log系统replay来恢复可以看出kafka系统在linkedin中的重要地位,不光是d..._the log: what every software engineer should know about real-time data's uni

《伟大是熬出来的》冯仑与年轻人闲话人生之一-程序员宅基地

文章浏览阅读746次。伟大是熬出来的  目录  前言  引言 时间熬成伟大:领导者要像狼一样坚忍   第一章 内圣外王——领导者的心态修炼  1. 天纵英才的自信心  2. 上天揽月的企图心  3. 誓不回头的决心  4. 宠辱不惊的平常心  5. 换位思考的同理心  6. 激情四射的热心  第二章 日清日高——领导者的高效能修炼  7. 积极主动,想到做到  8. 合理掌控自己的时间和生命  9. 制定目标,马..._当狼拖着受伤的右腿逃生时,右腿会成为前进的阻碍,它会毫不犹豫撕咬断自己的腿, 以

有源光缆AOC知识百科汇总-程序员宅基地

文章浏览阅读285次。在当今的大数据时代,人们对高速度和高带宽的需求越来越大,迫切希望有一种新型产品来作为高性能计算和数据中心的主要传输媒质,所以有源光缆(AOC)在这种环境下诞生了。有源光缆究竟是什么呢?应用在哪些领域,有什么优势呢?易天将为您解答!有源光缆(Active Optical Cables,简称AOC)是两端装有光收发器件的光纤线缆,主要构成部件分为光路和电路两部分。作为一种高性能计..._aoc 光缆