Java中理论说是一个字符(汉字 字母)占用两个字节。

但是在UTF-8的时候 new String("字").getBytes().length 返回的是3 表示3个字节

作者:RednaxelaFX

链接:https://www.zhihu.com/question/27562173/answer/37188642

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题主要区分清楚内码(internal encoding)和外码(external encoding)就好了。内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行参数之类的。Java语言规范规定,Java的char类型是UTF-16的code unit,也就是一定是16位(2字节);char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1).然后字符串是UTF-16 code unit的序列:The Java programming language represents text in sequences of 16-bit code units, using the UTF-16 encoding.这样,Java规定了字符的内码要用UTF-16编码。或者至少要让用户无法感知到String内部采用了非UTF-16的编码。“感知”可以是多方面的,例如随机访问某个下标的code unit(String.charAt())应该是O(1)操作,这只有使用UTF-16或者别的“定长”编码才可以做到。注意我这里说的“定长”特指code unit定长,而不是说code point定长。String.getBytes()是一个用于将String的内码转换为指定的外码的方法。无参数版使用平台的默认编码作为外码,有参数版使用参数指定的编码作为外码;将String的内容用外码编码好,结果放在一个新byte[]返回。题主的例子里,显然外码是UTF-8,那么调用了String.getBytes()之后得到的byte[]只能表明该外码的性质,而无法碰触到String内码的任何特质。另举一例:Java标准库实现的对char与String的序列化规定使用UTF-8作为外码。Java的Class文件中的字符串常量与符号名字也都规定用UTF-8编码。这大概是当时设计者为了平衡运行时的时间效率(采用定长编码的UTF-16)与外部存储的空间效率(采用变长的UTF-8编码)而做的取舍。题外话1:可惜UTF-16在Java设计之初还是真的定长编码,后来Unicode涵盖的字符变多了之后UTF-16变成了坑爹的变长编码(一个完整的“字符”是一个code point;一个code point可以对应1到2个code unit;一个code unit是16位),Java也只好跟进。为了实现UTF-16的变长编码语义,Java规定char仍然只能是一个16位的code point,也就是说Java的char类型不一定能表示一个UTF-16的“字符”——只有只需1个code unit的code point才可以完整的存在char里。但String作为char的序列,可以包含由两个code unit组成的“surrogate pair”来表示需要2个code unit表示的UTF-16 code point。为此Java的标准库新加了一套用于访问code point的API,而这套API就表现出了UTF-16的变长特性。题外话2:前面我说Java的内码时说得比较松,留下了“不总是使用UTF-16作为内码,但是用户无法感知区别”的余地。在Sun JDK6中有一个“压缩字符串”(-XX:+UseCompressedString)的功能。启用后,String内部存储字符串内容可能用byte[],也可能用char[];当整个字符串所有字符都在ASCII编码范围内时,就使用byte[](ASCII序列)来存储,此时字符串就处于“压缩”状态;反之,只要有任何一个字符超出了ASCII的编码范围,就退回到用char[](UTF-16序列)来存储。ASCII编码也是一种定长编码,而且其涵盖的字符是UTF-16的真子集;用户在对一个“压缩”的字符串访问其内容时(例如String.charAt()),只需对ASCII字符做无符号扩展就可以得到对应的UTF-16 code unit。这样用户也就无法感知到Java String的内码不是UTF-16的情况。Sun JDK6对“压缩字符串”的实现不够理想,实现太复杂而效果未如预期的好,所以没有包含在OpenJDK6、Oracle JDK7/OpenJDK7里。现在Oracle在重新审视“压缩字符串”功能,有可能在JDK9重新实现出来。题外话3:同样规定使用UTF-16作为内码的JavaScript语言,其实现广泛应用了“压缩字符串”的思想。现在主流的JavaScript引擎都会尽可能用ASCII内码的字符串,不过用户能接触的API只能看到UTF-16 code unit。

java一个字符几个字节_Java 语言中一个字符占几个字节?相关推荐

  1. 字符b是多少java_Java语言中一个字符占几个字节

    展开全部 Java规定了字符的内码要用UTF-16编码,一个字符是2个字节.外码字符所占字32313133353236313431303231363533e58685e5aeb931333431373 ...

  2. c语言中布尔类型占几个字节,JAVA基本数据类型所占字节数是多少?

    byte     1字节 short    2字节 int      4字节 long     8字节 char     2字节(C语言中是1字节)可以存储一个汉字 float    4字节 doub ...

  3. java 图片转成base64编码_java语言中如何将一个图片转换为base64编码的数据呢?

    摘要: 下文讲述java语言中将图片转换为base64编码的方法分享,如下所示: 例: /* file为图片文件对象 filePath为转换后base64的存储位置 */ public static ...

  4. C语言中如何把位赋值给字节,优秀程序员必须知道的20个位运算技巧

    一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读&l ...

  5. Java语言中一个字符占几个字节?

    要区分清楚内码(internal encoding)和外码(external encoding)就好了. 内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编 ...

  6. Java 语言中一个字符占几个字节?

    Java基本数据类型 类型 大小 范围/精度 byte 1字节 8位,最小值是 -128(-2^7): 最大值是 127(2^7-1) short 2字节 16位,最小值是 -32768(-2^15) ...

  7. java两个和三个_Java语言基础(day_03)

    数据类型中补充的几个小问题 1)在定义Long或者Float类型变量的时候,要加L或者f.整数默认是int类型,浮点数默认晨double. byte,short在定义的肘候,他们接收的某实是一个int ...

  8. java 汉字 字节_java中的汉字占几个字节

    java中的汉字占几个字节 发布时间:2020-06-25 20:02:07 来源:亿速云 阅读:217 作者:Leah 今天就跟大家聊聊有关java中的汉字占几个字节,可能很多人都不太了解,为了让大 ...

  9. java 定义一组常量用什么最好_Java语言中定义常量注意事项解析

    一.常量定义的基本注意事项. 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来定义常量.当常量被设定后,一般情况下就不允许再进行更改.如可以利用如下的形式来定 ...

  10. java int几个字节_java中的int占几个字节

    java中的int占几个字节 发布时间:2020-06-26 18:07:29 来源:亿速云 阅读:131 作者:Leah 今天就跟大家聊聊有关java中的int占几个字节,可能很多人都不太了解,为了 ...

最新文章

  1. 你为世界杯而战,我为生活而战!
  2. Apache Tiles 学习(四)、Tiles实战
  3. 5GS 协议栈 — PFCP 协议 — BAR 缓存行为规则
  4. python爬虫beautifulsoup实例-【Python实例二】BeautifulSoup爬虫简单实践
  5. 伪基站识别技巧(一)
  6. 千灯照碧云,越夜越星沙
  7. HTTP、TCP、UDP,Socket,HTTPS
  8. 服务器磁盘系统,服务器磁盘阵列与操作系统
  9. [原创]mybatis中整合ehcache缓存框架的使用
  10. PHP—str_replace()替换函数的使用
  11. html2canvas 阿里云图片没显示_对标“百度网盘”?阿里云网盘横空出世
  12. 用友nc java启动不了_用友NC开发本地启动客户端时界面空白问题的解决
  13. 结合分析和数值技术 Python 在基本力学应用
  14. 怎样才算通用人工智能?
  15. 那些年踩过的坑-之《Android Q-高通平台UAC(USB Audio Class)调试记录》
  16. 什么样的语言可以进行反编译
  17. 小工具二:报文比对工具
  18. win10远程桌面连接凭据怎么设置_win10远程桌面怎么保存密码?win10让远程桌面记住密码的方法...
  19. 20180826 猿题库笔试题
  20. mixwit怀旧磁带音乐盒

热门文章

  1. JAVA实现邮箱注册功能
  2. 计算机文件夹怎样显示隐藏文件,显示隐藏文件夹,教您电脑如何显示隐藏文件夹...
  3. Paypal移动快速支付流程
  4. 年薪50万的大数据分析师养成记
  5. 等值面抽取技术(Iso-surfaces Extraction Technique)
  6. vue项目之页面底部出现白边及空白区域错误记录
  7. 松下伺服电机uvw接线图_伺服电机接线图图解
  8. C语言实现求两个数的和
  9. 南京大学计算机科学与技术系罗金宇,长春理工大学
  10. 支付系统---银行卡收单业务