首页 > 编程语言 >代码点和代码单元的理解-Java

代码点和代码单元的理解-Java

时间:2022-11-04 18:31:28浏览次数:66  
标签:字符 Java Unicode int 代码 str 单元


摘要

  • ​​1.概念​​
  • ​​2.获取方法​​
  • ​​3.代码点与代码单元的代码示例​​

1.概念

代码点(code point):与一个编码表中的某个字符对应的代码值.

在Unicode标准中,代码点采用十六进制书写,并加上前缀U+,​​例U+0041就是字母A的代码点.​

Unicode的代码点可以分成17个代码级别(code plane).
第一个代码级别成为基本的多语言级别,代码点从U+0000到U+FFFF,其中包括了经典的Unicode代码.
其余的16个附加级别,代码点从U+10000到U+10FFFF,其中包括了一些辅助字符(增补字符).
​增补字符是用一个长度为2的char数组表示的,分别表示高代理项和低代理项。​​ 关于增补字符的具体描述请看:关于Java增补字符

代码单元(code unit):在第一代码级别中,每个字符用16位表示(即代码单元);而辅助字符采用一对连续的代码单元进行编码.

UTF-16编码采用不同长度的编码表示所有的Unicode代码点.

通俗理解 :
代码点 : Unicode中的各个字符
代码单元 : 若一个字符的代码长度为16位,则为一个代码单元;若一个字符的代码长度有两个16的代码长度编码,则该字符有两个代码单元.

Unicode(代码点)

常用字符

辅助字符

数量(代码单元)

一个代码单元

一对代码单元

代码点和代码单元的理解-Java_java


(图片来源:​​char 码点和代码单元​​)

在Java中一个Unicode占2个字节(byte)
一个字节等于8比特位(bit)
因此,每个Unicode码占用16个比特位

2.获取方法

String.length()方法 :
​​​返回采用UTF-16编码表示的给定字符串所需要的代码单元数量.​​​ String.codePointCount(int beginIndex, int endIndex) :
​返回此String指定文本范围内的Unicode代码点数.​​ String.charAt(int index) :
​返回位置index的代码单元,n介于0~String.length()-1之间.​

3.代码点与代码单元的代码示例

从​​Unicode字符百科​​里面找到U+10000以后的一个字符进行试验.

public class CodePointDemo {
public static void main(String[] args) {
String str = "?";
System.out.println(str.length());// 输出该字符串的代码单元的数量
System.out.println(str.codePointCount(0, str.length()));// 输出该字符串的代码点数
System.out.println(Integer.toHexString(str.charAt(0)));// 先获得该字符第一个位置的代码单元的char类型字符,编译器先将char类型强转为int类型的值,后将int值转换为16进制数进行输出
System.out.println(Integer.toHexString(str.charAt(1)));//
System.out.println("\ud801\udcd1");// 将两个char类型字符输出组成了一个代码点?
}
}
/*输出:
2
1
d801
dcd1
?
*/

​Integer.toHexString(str.charAt(0))​​​需要注意,该代码用到了强转
关于强转的详细信息,请看:
首先,str.charAt(0)返回一个char类型字符,Integer.toHexString(int i)接受一个int类型的值,故需要先将char强转为int,在完成该代码.

public class StrongTurnDemo { public static void main(String[] args) { String str = "?"; int i = str.charAt(0); System.out.println(i); System.out.println(Integer.toHexString(i)); } } /*输出 : 55297 d801 */

对于char类型来说,charAt(int index)只能获取BMP的字符,对于增补字符,是无法正常获得的.所以当字符串中包含增补字符又该如何获取呢,当文档当中有增补字符呢?请看:​​如何读取字符串(包含增补字符)?-java​​


标签:字符,Java,Unicode,int,代码,str,单元
From: https://blog.51cto.com/u_14233037/5824481

相关文章

  • java8 函数式编程实现策略模式
    代码如下: /***java8函数式编程实现策略模式**@date2022/11/4*/publicclassFunctionStrategy{privatestaticMap<String,Function<String,Str......
  • java正则表达式
    参考:https://www.cnblogs.com/klb561/p/10850803.html1匹配验证-验证Email是否正确publicstaticvoidmain(String[]args){//要验证的字符串Stringstr=......
  • 神经网络初步(Neural Network)——思想 具体实例以及代码实现
    在前面我们详细的讨论过softmax损失函数以及SVM损失函数,以及应用了支持向量机进行图片分类的任务,不妨先复习一下支持向量机相关的思想内核:支持向量机想要寻求一组映射......
  • JAVAWeb - Filter(过滤器)
    Filter:过滤器,用来过滤网站数据;处理中文乱码登录验证....过滤器的分析:我们用户在使用web浏览器访问web服务器的时候;以往的过程都是web服务器直接去寻址拿资源(servlet......
  • 【Java】数组对象转实体对象
    使用说明使用时,要留意Object数组中值的顺序,需要与目标实体类中构造方法的形参的顺序保持一致,防止出现赋值错误的情况。工具类代码/***数据类型转换工具类*@author......
  • Java web登录学习
        下面是我们另一个登录的简单测试用的jsp文件<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><html><head><title>login.jsp......
  • Java学习笔记day4--Arrays工具类的基本使用
    packageday4_array;importjava.util.Arrays;publicclassArrayBool{publicstaticvoidmain(String[]args){//java.util.Arrays工具类.操作数组的......
  • Java基础之图书管理系统
    Java基础之图书管理系统一:建立信息表为图书管理人员编写一个图书管理系统,图书管理系统的设计主要是实现对图书的管理和相关操作,包括3个表:读者信息表——存储读者的......
  • Java学习笔记day4--数组算法(赋值,复制,反转,排序,查找)
    packageday4_array;publicclassAlgorithmArray{publicstaticvoidmain(String[]args){//数组赋值问题===============================......
  • Java学习笔记day4--数组常见异常Exception
    packageday4_array;/**数组中的常见异常:1.数组角标越界的异常ArrayIndexOutOfBoundsException2.空指针异常NullPointerException*/publiccla......