广告
返回顶部
首页 > 资讯 > 精选 >一个Java字符串中有多少个字符
  • 910
分享到

一个Java字符串中有多少个字符

2023-06-16 23:06:48 910人浏览 独家记忆
摘要

本篇内容主要讲解“一个Java字符串中有多少个字符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一个Java字符串中有多少个字符”吧!依照Java的文档, Java中的字符内部是以UTF-16编

本篇内容主要讲解“一个Java字符串中有多少个字符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一个Java字符串中有多少个字符”吧!

依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \u0000 (0),***值是\uffff(65535),  也就是一个字符以2个字节来表示,难道Java最多只能表示 65535个字符?

  • char: The char data type is a single 16-bit Unicode character. It has a  minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535  inclusive).

  • from The Java™ Tutorials

首先,让我们先看个例子:

public class Main {     public static void main(String[] args) {         // 中文常见字         String s = "你好";         System.out.println("1. string length =" + s.length());         System.out.println("1. string bytes length =" + s.getBytes().length);         System.out.println("1. string char length =" + s.toCharArray().length);         System.out.println();         // emojis         s = "??";         System.out.println("2. string length =" + s.length());         System.out.println("2. string bytes length =" + s.getBytes().length);         System.out.println("2. string char length =" + s.toCharArray().length);         System.out.println();         // 中文生僻字         s = "?妹";         System.out.println("3. string length =" + s.length());         System.out.println("3. string bytes length =" + s.getBytes().length);         System.out.println("3. string char length =" + s.toCharArray().length);         System.out.println();     } }

运行这个程序,你觉得输出结果是什么?

输出结果:

1. string length =2 1. string bytes length =6 1. string char length =2 2. string length =4 2. string bytes length =8 2. string char length =4 3. string length =3 3. string bytes length =7 3. string char length =3

我们知道,  String.getBytes()如果不指定编码格式,Java会使用操作系统的编码格式得到字节数组,在我的MacOS中,默认使用UTF-8作为字符编码(locale命令可以查看操作系统的编码),所以在我的机器运行,String.getBytes()会返回UTF-8编码的字节数组。

  • String.length返回Unicode code units的长度。

  • String.toCharArray返回字符数组。

我们设置的字符串都是两个unicode字符,输出结果:

  • 普通的中文字:字符串的长度是2,每个中文字按UTF-8编码是三个字节,字符数组的长度看起来也没问题

  • emojis字符: 我们设置了两个emojis字符,男女头像。结果字符串的长度是4, UTF-8编码8个字节,字符数组的长度是4

  • 生僻的中文字:我们设置了两个中文字,其中一个是生僻的中文字。结果字符串的长度是3, UTF-8编码7个字节,字符数组的长度是3

看起来字符串的字符数和我们预期的有点不一样,我们的字符串只有两个unicode字符, 可是输出结果有时候是2,有时候是3, 有时候是4,为什么呢?

这还得从Java的历史说起。

Java最初设计的Charactor用两个字节来表示unicode字符,这没有问题, 因为最初unicode中的字符还比较少, Java  1.1之前采用Unicode version 1.1.5, jdk 1.1中支持Unicode 2.0, JDK 1.1.7支持Unicode 2.1,  Java SE 1.4 支持 Unicode 3.0, Java SE 5.0开始支持Unicode 4.0。

直到Unicode 3.0, Java用两个字节来表示unicode字符还没有问题,因为Unicode 3.0最多49,259个字符,  两个字节可以表示65,535个字符,还足够容的下所有的uicode3.0字符。

但是Unicode 4.0(事实上自Unicode 3.1), 字符集进行很大的扩充,已经达到了96,447个字符,Unicode  11.0已经包含137,374个字符。

在Unicode中,为每一个字符对应一个编码点(一个整数),用 U+紧跟着十六进制数表示。所有字符按照使用上的频繁度划分为 17 个平面(编号为  0-16),即基本的多语言平面和增补平面。基本的多语言平面(英文为 Basic Multilingual Plane,简称 BMP)又称平面  0,收集了使用最广泛的字符。

这样一来,Java的Charactor的两个字节的设计,已经不足以容纳所有的Unicode 4的字符,  所以可能需要4个字节才能表示扩展字符,所以现在的Charactor代表的已经不再是一个字符 (代码点 code point), 而是一个代码单元(code  unit)。

  • Code Point:  代码点,一个字符的数字表示。一个字符集一般可以用一张或多张由多个行和多个列所构成的二维表来表示。二维表中行与列交叉的点称之为代码点,每个码点分配一个唯一的编号数字,称之为码点值或码点编号,除开某些特殊区域(比如代理区、专用区)的非字符代码点和保留代码点,每个代码点唯一对应于一个字符。  从U+0000 到 U+10FFFF。

  • Code Unit:代码单元,是指一个已编码的文本中具有最短的比特组合的单元。对于 UTF-8 来说,代码单元是 8 比特长;对于 UTF-16  来说,代码单元是 16 比特长。换一种说法就是 UTF-8 的是以一个字节为最小单位的,UTF-16 是以两个字节为最小单位的。

Java的字符在内部以UTF-16编码方式来表示,String.length返回的是Code  Unit的长度,而不再是Unicode中字符的长度。对于传统的BMP平面的代码点,String.length和我们传统理解的字符的数量是一致的,对于扩展的字符,String.length可能是我们理解的字符长度的两倍。

有可能你会问,  对于一个UTF-16编码的扩展字符,它以4个字节来表示,那么前两个字节会不会和BMP平面冲突,导致程序不知道它是扩展字符还是BMP平面的字符?

其实是不会的, 幸运的是, 在BMP平面中,  U+D800到U+DFFF之间的码位是***保留不映射到Unicode字符,UTF-16就利用保留下来的0xD800-0xDFFF区块的码位来对辅助平面的字符的码位进行编码。

UTF-16编码中,辅助平面中的码位从U+10000到U+10FFFF,共计FFFFF个,需要20位来表示。***个整数(两个字节,称为前导代理)要容纳上述20位的前10位,第二个整数(称为后尾代理)容纳上述20位的后10位。前导代理的值的范围是0xD800到0xDBFF,后尾代理的0xDC00~0xDFFF。可以看到前导代理和后尾代理的范围都落在了BMP平面中不用来映射的码位,所以不会产生冲突,而且前导代理和后尾代理也没有重合。这样我们得到两个字节的,就可以直接判断它是否是BMP平面的字符,还是扩展字符中的前导代理还是后尾代码。

国外的有些用户用emojis字符做自己的昵称,导致有些系统不能正确的显示出来,这是因为这些系统粗暴的使用Charactor来表示,在显示的时候截断的时候有时候可能不是在正确的代码点上进行截断。

到此,相信大家对“一个Java字符串中有多少个字符”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 一个Java字符串中有多少个字符

本文链接: https://www.lsjlt.com/news/285973.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一个Java字符串中有多少个字符
    本篇内容主要讲解“一个Java字符串中有多少个字符”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“一个Java字符串中有多少个字符”吧!依照Java的文档, Java中的字符内部是以UTF-16编...
    99+
    2023-06-16
  • 一个字符串中的字符有多少个
    这篇文章给大家介绍一个字符串中的字符有多少个,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \\u0000 (0),最大值是\\ufff...
    99+
    2023-06-16
  • 如何求一个字符串中有多少个pat
    本篇内容介绍了“如何求一个字符串中有多少个pat”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!有几个pat...
    99+
    2022-10-19
  • php如何计算字符串有多少个m字符
    本篇内容介绍了“php如何计算字符串有多少个m字符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两种计算方法:1、使用for语句循环遍历字符...
    99+
    2023-07-02
  • php怎么计算字符串有多少个m字符
    两种计算方法:1、使用for语句循环遍历字符串中的字符,统计m字符的个数,语法“$con=0;for($i=0;$i<strlen($str);$i++){if($str[$i]==="m"){$con++;}}”...
    99+
    2022-07-04
    php php字符串
  • Java判断一个字符串是否包含某个字符串
    开发过程中,有时会判断一个字符串是否包含某个字符串的操作,这里总结判断方法。 方式一:contains()方法         理解:contains() 方法用于判断字符串中是否包含指定的字符或字符串。(判断一个字符串是否包含某个字符串)...
    99+
    2023-09-03
    java
  • Java判断一个字符串是否包含某个字符
    1 问题 如何利用Java通过不同的方法来判断一个字符串是否包含某个字符。 2 方法 .contains方法 这个是利用java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序...
    99+
    2023-09-11
    java 开发语言 servlet
  • Java如何判断一个字符串包含了另外一个字符串
    这篇文章主要介绍了Java如何判断一个字符串包含了另外一个字符串,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何判断一个字符串包含了另外一个字符串这道题有点简单,对吧上一道...
    99+
    2023-06-27
  • 统计一个字符串中相同字符的个数
    作为测试小白,苦练代码基本功,啥时候都不嫌晚。 今天在测试群里,看到小伙伴在面试中有个题目,用一段代码对一个字符串进行统计,分别输出字符与数量!!! 于是用业余时间写了下: #!/usr/bin/env python # -*- co...
    99+
    2023-01-30
    字符串 字符 个数
  • ascii中一个字符占多个个字节
    这篇文章给大家分享的是有关ascii中一个字符占多个个字节的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ascii一个字符占一个字节,ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符;...
    99+
    2023-06-14
  • php如何删除字符串中多个字符
    本篇内容介绍了“php如何删除字符串中多个字符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在php中,可以利用substr_replace...
    99+
    2023-06-20
  • java中如何判断一个字符串包含几个指定字符
    可以用String类里的indexOf(String s,int i)方法,这个方法s是字符串div,i是从i下标开始查找该字符串在调用字符串中的位置,返回值是int类型。相关学习视频推荐:java视频教程实例如下://创建方法ciShu,...
    99+
    2015-04-27
    java 判断 字符串 指定 字符
  • php字符串如何替换一个字符
    这篇“php字符串如何替换一个字符”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php字符串如何替换一个字符”文章吧。替换1...
    99+
    2023-06-30
  • java中字符串占几个字节
    首先,char为Java的基本类型,基本类型所占的字节数是固定的,如int占4字节,double占8字节,这可以使得Java在不同的平台上所占类型固定,很好地保证了Java的可移植性。因此,Java中char类型固定占2个字节。(注:cha...
    99+
    2020-07-12
    java入门 java 字符串 字节
  • Python教程:字符串中的第一个唯一字符
    Python教程——字符串中的第一个唯一字符题目:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。案例:s = "leetcode"返回 0.s&nbs...
    99+
    2023-06-02
  • java中判断一个字符串是否包含某个字符的方法
    一、contains方法描述java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序列。声明public boolean contains(CharSequence s)在线相关视频学...
    99+
    2020-03-28
    java 判断 字符串 包含 字符
  • Java中如何输入一个字符串
    Java中如何输入一个字符串 首先需导入java.util包中的Scanner类,如图: 接着在main里创建Scanner类对象,记得要把System.in加上这是专门获取用户输入的内容...
    99+
    2023-09-20
    java 开发语言
  • java怎么添加多个字符串
    在Java中,可以通过以下几种方法来添加多个字符串:1. 使用"+"运算符进行字符串拼接:```javaString str1 = ...
    99+
    2023-10-07
    java
  • mysql怎么获取字符串中的一个字符
    mysql字符串截取的语法:“substring(str, pos); substring(str, pos, len)”mysql获取字符串中一个字符的示例:字符串截取语法:substring(str, po...
    99+
    2022-10-04
  • php如何替换字符串中第一个字符
    小编给大家分享一下php如何替换字符串中第一个字符,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在PHP中,可以使用substr_replace()函数来替换字符...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作