码点和代码单元

以下为百度百科上对于码点的概念:
点代码又称代码点。用于编码抽象字符的整数范围叫做代码空间,其中的特殊整数叫做代码点。当抽象字符被映射或在代码空间中被指定为特殊代码点时,就被叫做编码字符。

通俗来讲,码点就是一个字符,无论他是一个字母,一个数字,或者一个特殊符号(例如𝕆、☃),这些都是一个码点。

而代码单元就不同了,它是根据你的字符集判定的。例如,常用的UTF-8,他的一个代码单元是8位,而在UTF-16中,他的代码单元是16位。(不了解编码格式的可以看看这篇文章 https://blog.csdn.net/ldanduo/article/details/8203532/

字符串中常用的length()方法就是返回字符集给定字符串所需要的代码单元数量。
下面用𝕆这个符号实验,

		String s="𝕆";
		System.out.println("字符:"+s);
		System.out.println("码点数:"+s.codePointCount(0,s.length()));
		System.out.println("代码单元长度:"+s.length());

这里codePointCount()方法就是返回字符串对象的码点数,第一个参数为beginIndex, 第二个参数为endIndex
输出结果如下:
在这里插入图片描述
接下来我们输出看看他们的UniCode编码,

for (int i = 0; i < s.length(); i++) {
			System.out.println(Integer.toHexString((int)s.charAt(i)));
		}
		char c1='A';
		char c2='哈';
		System.out.println("A的编码:"+Integer.toHexString(c1));
		System.out.println("哈的编码:"+Integer.toHexString(c2));

输出结果如下:
在这里插入图片描述
(A的编码完整写法应该是\u0041,哈的完整写法是\u54c8,他这里都省略了)
𝕆的编码为\uD835\uDD46,他比另外两个都长一个代码单元。但是他们的码点都是1。

下面给出一些关于代码单元和码点的常用方法
(摘自《java核心技术 卷一 》第三章,书不错,有兴趣可以看看)

String greeting="Hello";
//调用s.charAt(n)将返回位置n的代码单元,n介于0~s.length()-1之间
char first =greeting.charAt(0);//first is 'H'
char first =greeting.charAt(4);//last is 'O'
//想要得到第i个码点,则要使用下面的语句
int index =greeting.offsetByCodePoints(0,i);
// int offsetByCodePoints(int startIndex,int cpCount) 返回从startIndex代码点开始,位移cpCount后的码点索引
int cp =greeting.codePointAt(index);
//遍历一个字符串,并依次查看买一个码点,可以将它转换成一个数组
int[] codePoints =str.codePoints().toArray();
//反之,要把一个码点数组转换成一个字符串
String str=new String(codePoints,0,codePoints.length);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值