我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本篇内容主要讲解“一个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字符串中有多少个字符”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

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

这篇文章给大家介绍一个字符串中的字符有多少个,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \\u0000 (0),最大值是\\ufff
2023-06-16

php怎么计算字符串有多少个m字符

两种计算方法:1、使用for语句循环遍历字符串中的字符,统计m字符的个数,语法“$con=0;for($i=0;$i
2022-07-04

php如何计算字符串有多少个m字符

本篇内容介绍了“php如何计算字符串有多少个m字符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两种计算方法:1、使用for语句循环遍历字符
2023-07-02

Java如何输出一个或多个字符串

本文介绍了Java中输出字符串的多种方法,包括System.out.print()、System.out.println()、String.format()、PrintWriter、StringBuilder和字符串连接运算符(+)。对于简单输出,建议使用System.out.print()或System.out.println();对于格式化输出,可以使用String.format();对于高级输出控制,可以使用PrintWriter;对于高效构建字符串,可以使用StringBuilder;对于循环中连
Java如何输出一个或多个字符串
2024-04-02

Java如何使用一个字符串替换字符串中的另一些字符

本文介绍了在Java中替换字符串字符的几种方法:使用String.replace():查找并替换指定字符或子字符串。使用String.replaceAll():使用正则表达式查找并替换字符或子字符串。使用String.replaceFirst():只替换第一个匹配项。使用StringBuilder.append()和.toString():高效修改字符串。使用ApacheCommonsLangStringUtils类:提供丰富字符串处理方法。选择最合适的替换方法取决于具体需求和性能考虑因素。
Java如何使用一个字符串替换字符串中的另一些字符
2024-04-02

Java如何判断一个字符串包含了另外一个字符串

这篇文章主要介绍了Java如何判断一个字符串包含了另外一个字符串,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何判断一个字符串包含了另外一个字符串这道题有点简单,对吧?上一
2023-06-27

统计一个字符串中相同字符的个数

作为测试小白,苦练代码基本功,啥时候都不嫌晚。今天在测试群里,看到小伙伴在面试中有个题目,用一段代码对一个字符串进行统计,分别输出字符与数量!!!于是用业余时间写了下:#!/usr/bin/env python# -*- coding:u
2023-01-30

Java如何在字符串中查找一组字符的任何一个字符

Java中查找字符串中一组字符的任意一个字符的方法包括:indexOf(String):返回子字符串首次出现的索引,找不到则返回-1。matches(String):使用正则表达式检查字符串是否与模式匹配。contains(String):检查字符串是否包含指定的子字符串。正则表达式也可以用于查找,表示字符串中必须包含一组字符中的至少一个字符。选择方法取决于效率和可读性要求。
Java如何在字符串中查找一组字符的任何一个字符
2024-04-02

ascii中一个字符占多个个字节

这篇文章给大家分享的是有关ascii中一个字符占多个个字节的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ascii一个字符占一个字节,ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符;
2023-06-14

php如何删除字符串中多个字符

本篇内容介绍了“php如何删除字符串中多个字符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在php中,可以利用substr_replace
2023-06-20

java中如何判断一个字符串包含几个指定字符

可以用String类里的indexOf(String s,int i)方法,这个方法s是字符串div,i是从i下标开始查找该字符串在调用字符串中的位置,返回值是int类型。相关学习视频推荐:java视频教程实例如下://创建方法ciShu,返回int计算s2在
java中如何判断一个字符串包含几个指定字符
2015-04-27

Java如何搜索一个字符串在另一个字符串中的第一次出现

查找字符串在Java中的出现:Java的indexOf()方法返回子字符串在主字符串中的第一次出现索引。matches()方法使用正则表达式检查匹配模式。lastIndexOf()返回最后一次出现索引,contains()检查是否存在,startsWith()和endsWith()分别检查开头和结尾匹配。
Java如何搜索一个字符串在另一个字符串中的第一次出现
2024-04-02

替换字符串中的最后一个字符

php小编柚子在这里为大家介绍一个有用的字符串处理技巧——替换字符串中的最后一个字符。在编程中,有时候我们需要对字符串进行修改,而最后一个字符往往是需要被替换的对象。通过一些简单的操作,我们可以轻松实现这个功能。接下来,我们将详细介绍如何使
替换字符串中的最后一个字符
2024-02-09

java中字符串占几个字节

首先,char为Java的基本类型,基本类型所占的字节数是固定的,如int占4字节,double占8字节,这可以使得Java在不同的平台上所占类型固定,很好地保证了Java的可移植性。因此,Java中char类型固定占2个字节。(注:char类型也可以存储一个
java中字符串占几个字节
2020-07-12

Java如何使用一个字符串分割另一个字符串为数组

Java的String.split()方法可使用分隔符将字符串分割为数组,语法为:split(regex)。regex指定分隔符正则表达式。可以使用空格、句点、逗号和正则表达式作为分隔符。split()适用于解析文本数据、拆分路径或提取字符串中的特定信息。
Java如何使用一个字符串分割另一个字符串为数组
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录