char类型和Unicode编码

【0】README
0.1)本文对 char类型和Unicode编码 的总结并不完整,仅供参考;
0.2)本文获取Unicode辅助字符的代码点的idea转自: 
http://blog.csdn.net/xujinsmile/article/details/8526387 , 
http://bbs.csdn.net/topics/340195349 , http://blog.csdn.net/longyulu/article/details/7374862;

【1】char 类型
1)char类型:它用于表示单个字符, 通常用来表示字符常量;
2)Unicode编码单元: 它可以表示为16进制值, 其范围从 \u0000 ~ \uffff; 如\u03C0 表示希腊字母 π;
3)转移序列:
3.1)除了可以采用转义序列符 \u 表示Unicode 代码单元的编码外, 还有一些用于表示特殊字符的转移序列符,看下表:
3.2)所有这些转义序列符都可以出现在字符常量或字符串的引号内;如'\u2122' 和 "hello\n";
3.3)转移序列符 \u 还可以出现在 字符常量或字符串的引号之外(其他的转移序列不可以), 如 public static void main(String \u005B\u005D args) ,其中 \u005B 和 \u005D 是 '[' 和 ']' 的编码;
4)出现的问题+解决方法(引入Unicode编码):
4.1)要想弄清char类型, 就必须了解Unicode编码表(干货——引入了Unicode编码表)Unicode打破了传统字符编码的限制。在Unicode出现之前, 已经有许多不同的标准:美国的ASCII、西欧语言的ISO、中国的GB 18030 和 BIG-5 等, 这样就产生了两个问题:一是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母; 二是采用大字符集的语言其编码长度有可能不同;(如一些字符采用单字节编码,而另一些字符采用多字节编码)
4.2)如何解决:人们认为两个字节的代码宽度足以能够对世界上各种语言的所有字符进行编码, 并有足够的空间留给未来的扩展;
4.3)1991年,发布的Unicode1.0 : 仅占用了 65535个代码值中不到一半的部分,在设计Java时 决定采用16位的Unicode 字符集;但是后来Unicode 增加了对汉语、日语和韩语的处理使得字符个数超过了 65536, 这样使得 Java的16位的 char 类型已经不能满足描述所有 Unicode字符的需要了;
5)下面用专业术语解释Java语言解决这个问题的基本方法:
5.1)代码点: 从JDK5.0开始, 代码点是指与一个编码表中的某个字符对应的代码值;在Unicode标准中, 代码点采用16进制书写,并加上前缀 U+, 例如 U+0041 表示字符A的代码点;(干货——代码点的定义)
5.2)代码级别:Unicode的代码点可以分成17 个代码级别, 第一个代码级别称为基本的多语言级别, 代码点从 U+0000~U+FFFF;其余的16个附加级别,代码点从U+10000~U+10FFFF, 其中包括了一些辅助字符;(干货——代码级别的定义)
5.3)代码单元:在UTF-16中, 每个字符用16位表示,这叫一个代码单元;而辅助字符采用一对连续的代码单元进行编码;(干货——代码单元的定义,一个Unicode代码单元==16位==2个字节)
5.4)这样构成的编码值:一定落入基本的多语言级别中空闲的2048字节内,通常被替代区域(U+D800~U+DBFF用于第一个代码单元,而U+DC00~U+DFFF用于第二个代码单元)。这样的设计十分巧妙,我们可以从中迅速知道一个代码单元是一个字符编码,还是一个辅助字符的第一或第二部分。
看个Unicode字符的编码荔枝)对于整数集合的数学符号Z, 它的代码点是 U+1D56B,并且是用两个代码单元U+D835 和 U+DD6B 编码的;(具体参见 https://en.wikipedia.org/wiki/UTF-16
6)Java采用UTF-16:在Java中, char类型用 UTF-16 编码描述一个代码单元;(干货——char类型用UTF-16 编码描述一个代码单元,char类型就是一个Unicode代码单元, Unicode码元==Unicode代码单元)
7)Warning)我们强烈建议,不要在程序中使用char类型, 除非确实需要对 UTF-16代码单元进行操作。最好将 需要处理的字符串用抽象数据类型表示;

【2】Unicode编码中的代码点和代码单元 
1)Java 字符串由char 序列组成: char数据类型是一个采用 UTF-16 编码表示 Unicode代码点的代码单元, 大多数的常用 Unicode字符使用一个代码单元就可以表示, 而辅助字符需要一对代码单元表示;
2)length方法: 它将返回采用 UTF-16 编码表示的给定字符串所需要的代码单元数量;
3)看荔枝:
package com.tomcat.test;public class UnicodeTest {public static void main1(String[] args) {String greeting = "hello";System.out.println(greeting.length()); // Unicode代码单元(码元)数量 // 5int codePointCount = greeting.codePointCount(0, greeting.length());System.out.println(codePointCount); //Unicode代码点数量 // 5char first = greeting.charAt(0);// 返回位置0的代码单元 // 'h'System.out.println(first);// 要想得到第i个代码点for (int i = 0; i < greeting.length(); i++) {int index = greeting.offsetByCodePoints(0, i);int codePoint = greeting.codePointAt(index);System.out.println("index = " + index + ", codePoint = " + codePoint + ", " + (char)codePoint);}/*** output*  55hindex = 0, cp = 104, hindex = 1, cp = 101, eindex = 2, cp = 108, lindex = 3, cp = 108, lindex = 4, cp = 111, o*/}public static void main2(String[] args) {String sentence = "\u1D56B is the set of integers";for (int i = 0; i < sentence.length();) {int codePoint = sentence.codePointAt(i);if(Character.isSupplementaryCodePoint(codePoint)) {i += 2;} else {i++;}System.out.println(codePoint + ", " + (char)codePoint);}}public static void main3(String...args){       char[] ch = Character.toChars(0x10400);  System.out.printf("U+10400 高代理字符: %04x\n", (int)ch[0]);//d801  System.out.printf("U+10400 低代理字符: %04x\n", (int)ch[1]);//dc00     String str = new String(ch);  System.out.println("代码单元长度: " + str.length());//2  System.out.println("代码点数量: " + str.codePointCount(0, str.length()));//1  System.out.println(str.codePointAt(0));//返回给定位置开始或结束的代码点,66560  System.out.println(str.charAt(1));//返回给定位置的代码单元,由于未定义,返回?  //遍历一个字符串,打印出所有字符的代码点  str += "Hello,world!";  int i = 0;  int cp = str.codePointAt(i);  while(i < str.length()){  System.out.println(str.codePointAt(i) + ", " + (char)str.codePointAt(i));  if(Character.isSupplementaryCodePoint(cp))  i += 2;//如果cp所在的位置是代码点的第一部分,执行此处  else i++;  }  /* * 66560  * 72  * 108  * 111  * 119  * 114  * 100 */  }  	 
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫画:什么是一致性哈希

转载自 玻璃猫 程序员小灰一年之前——未来两年内&#xff0c;系统预估的总订单数量可达一亿条左右。 按Mysql单表存储500万条记录来算&#xff0c;暂时不必分库&#xff0c;单库30个分表是比较合适的水平分表方案。 于是小灰设计了这样的分表逻辑&#xff1a; 订单表创建单库3…

小程序真机测试错误代码_测试不充分:知道您的代码是否真的可以投入生产的5种方法...

小程序真机测试错误代码当今的企业都在提高软件交付速度。 但是&#xff0c;发布周期较短时&#xff0c;通常会牺牲代码质量。 当今的DevOps和QA团队承受着防止代码缺陷进入生产的压力&#xff0c;但他们还需要管理空前的工作负载&#xff0c;并且需要比以往更少的时间和资源来…

tomcat(5)servlet容器

【0】README0.0&#xff09;本文部分文字描述转自&#xff1a;“深入剖析tomcat”&#xff0c;旨在学习 tomcat(5)servlet容器 的基础知识&#xff1b;0.1&#xff09;intro to servlet容器&#xff1a;servlet容器是用来处理请求servlet资源&#xff0c;并为web客户端填充resp…

漫画算法:如何判断链表有环

转载自 玻璃猫 程序员小灰 大四毕业前夕&#xff0c;计算机学院&#xff0c; 正在四处求职的小灰碰到了同系的学霸大黄…… 小灰边说边回忆着上周去面试的情形…… 有一个单向链表&#xff0c;链表当中有可能出现“环”&#xff0c;就像下图这样。如何用程序判断出这个链表是…

jdk 加密_使用JDK的密码流的加密怪癖(以及该怎么做)

jdk 加密在我们的日常工作中&#xff0c;我们经常遇到经常性的主题&#xff0c;即将数据&#xff08;例如文件&#xff09;从一个位置传输到另一个位置。 这听起来像是一个非常简单的任务&#xff0c;但让我们通过声明这些文件可能包含机密信息并可以通过非安全的通信渠道进行传…

tomcat(5)servlet容器(lastest version)

【0】README0.0&#xff09;本文部分文字描述转自&#xff1a;“深入剖析tomcat”&#xff0c;旨在学习 tomcat(5)servlet容器 的基础知识&#xff1b;0.1&#xff09;intro to servlet容器&#xff1a;servlet容器是用来处理请求servlet资源&#xff0c;并为web客户端填充resp…

漫画:什么是跳跃表

转载自 玻璃猫 程序员小灰这是发生在很多年以前的故事......几天以前......几天之后......拍卖行的商品总数量有几十万件&#xff0c;对应数据库商品表的几十万条记录。如果是按照商品名称精确查询还好办&#xff0c;可以直接从数据库查出来&#xff0c;最多也就上百条记录。如…

带有Prometheus的弹簧靴和Micrometer第5部分:旋转Prometheus

以前&#xff0c;我们获得了Spring Boot Application适配器&#xff0c;以便为Prometheus公开端点。 该博客将重点介绍如何设置和配置Prometheus&#xff0c;以便为Spring Boot端点提供服务器。 因此&#xff0c;让我们开始使用docker来启动Prometheus服务器。 在继续进行Pr…

漫画:什么是动态规划?(整合版)

转载自 玻璃猫 程序员小灰 ———————————— 题目&#xff1a; 有一座高度是10级台阶的楼梯&#xff0c;从下往上走&#xff0c;每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 比如&#xff0c;每次走1级台阶&#xff0c;一共走10步&#xff…

tomcat(6)生命周期

【0】README0.1&#xff09;本文部分文字描述转自“深入剖析tomcat”&#xff0c;旨在学习 “tomcat生命周期” 的基础知识&#xff1b;0.2&#xff09;for source code, please visit https://github.com/pacosonTang/HowTomcatWorks/tree/master/chapter6 0.3&#xff09;温…

移位操作提高代码的可读性_本地记录或类,以提高流操作的可读性

移位操作提高代码的可读性Java 14带有Records的预览语言功能—一种特殊的轻量级类&#xff0c;可以与其他语言中的类似构造进行比较&#xff0c;例如C&#xff03;中的record类&#xff0c;Kotlin中的data类和Scala中的case类。 A&#xff09;已经有许多博客文章解释Java 14记…

漫画算法:无序数组排序后的最大相邻差值

转载自 玻璃猫 程序员小灰 小灰一边回忆一边讲述起当时面试的情景...... 题目&#xff1a;有一个无序整型数组&#xff0c;如何求出这个数组排序后的任意两个相邻元素的最大差值&#xff1f;要求时间和空间复杂度尽可能低。&#xff08;例如&#xff1a;无序数组 2,3,1,4,6&…

serv-u 数据备份_如何使用用户数据脚本在EC2实例上安装Apache Web Server

serv-u 数据备份你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何使用用户数据脚本在EC2实例上安装Apache Web Server。 在我以前的教程之一中&#xff0c;我已经解释了如何使用AWS控制台启动EC2实例。如果您还没有完成该操作&#xff0c;我建议您先进行一下操作。…

哈儿小波分解和重构(降维和升维)实现算法

【0】README0.1&#xff09;本文旨在讲解 哈儿小波变换&#xff08;分解和重构&#xff09;进行数据的降维和升维&#xff1b;【timestamp: 1703281610】时隔几个月再来review 哈儿小波变换算法的具体思路&#xff1a;1&#xff09;分解降维&#xff1a;首先对所有item进行分解…

漫画算法:判断2的乘方

转载自 玻璃猫 程序员小灰 小灰陷入回忆当中。。。。 题目&#xff1a;实现一个方法&#xff0c;判断一个正整数是否是2的乘方&#xff08;比如16是2的4次方&#xff0c;返回True&#xff1b;18不是2的乘方&#xff0c;返回False&#xff09;。要求性能尽可能高。 解法一&…

k66 pit计时功能配置_PIT,JUnit 5和Gradle –仅需额外的一行配置

k66 pit计时功能配置在Gradle&#xff08;带有gradle-pitest-plugin 1.4.7&#xff09;中发现简单&#xff0c;改进的PIT和JUnit 5配置。 不可否认&#xff0c;如今JUnit 5越来越受欢迎。 虽然为JUnit 5提供了一个专用于PIT的插件&#xff0c;并且gradle-pitest-plugin支持了很…

tomcat(7)日志记录器

【0】README0.1&#xff09;本文部分文字描述转自&#xff1a;“深入剖析tomcat”&#xff0c;旨在学习 “tomcat的日志记录器” 的基础知识&#xff1b;0.2&#xff09;intro to 日志记录器&#xff1a;日志记录器是用来记录消息的组件&#xff1b;0.3&#xff09;for complet…

漫画算法:最小栈的实现

转载自 玻璃猫 程序员小灰 小灰回忆起当时的情景…… 题目&#xff1a;实现一个栈&#xff0c;带有出栈&#xff08;pop&#xff09;&#xff0c;入栈&#xff08;push&#xff09;&#xff0c;取最小元素&#xff08;getMin&#xff09;三个方法。要保证这三个方法的时间复杂度…

oidc auth2.0_将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成

oidc auth2.0如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权&#xff0c;则可能需要将下一个Web应用程序与Auth0集成。 有多种方法可以执行此操作&#xff0c;例如&#xff0c;如果要将Jenkins与Auth0集成&#xff0c;则可以使用SAML v2&#xff1b;否则&a…

follow 开源项目关于NoClassDefFoundError错误的解决方法

【0】README0.1&#xff09;本文旨在po出当我们follow open projects 的时候&#xff0c;遇到一些在open API中不存在&#xff08;NoClassDefFoundError&#xff09;的类时的解决方法&#xff1b;【1】problemsolution&#xff1a;1.1&#xff09;problem&#xff1a;一般case下…