要区分清楚内码(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的编码。

另举一例:
Java标准库实现的对char与String的序列化规定使用UTF-8作为外码。Java的Class文件中的字符串常量与符号名字也都规定用UTF-8编码。这大概是当时设计者为了平衡运行时的时间效率(采用定长编码的UTF-16)与外部存储的空间效率(采用变长的UTF-8编码)而做的取舍。
作者:国栋
链接:https://www.zhihu.com/question/27562173/answer/76208352
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先,你所谓的“字符”具体指什么呢?

如果你说的“字符”就是指 Java 中的 char,那好,那它就是 16 位,2 字节。

如果你说的“字符”是指我们用眼睛看到的那些“抽象的字符”,那么,谈论它占几个字节是没有意义的。

具体地讲,脱离具体的编码谈某个字符占几个字节是没有意义的

就好比有一个抽象的整数“42”,你说它占几个字节?这得具体看你是用 byte,short,int,还是 long 来存它。用 byte 存就占一字节,用 short 存就占两字节,int 通常是四字节,long 通常八字节。当然,如果你用 byte,受限于它有限的位数,有些数它是存不了的,比如 256 就无法放在一个 byte 里了。

字符是同样的道理,如果你想谈“占几个字节”,就要先把编码说清楚。

同一个字符在不同的编码下可能占不同的字节

就以你举的“”字为例,“”在 GBK 编码下占 2 字节,在 UTF-16 编码下也占 2 字节,在 UTF-8 编码下占 3 字节,在 UTF-32 编码下占 4 字节。

不同的字符在同一个编码下也可能占不同的字节

”在 UTF-8 编码下占3字节,而“A”在 UTF-8 编码下占 1 字节。(因为 UTF-8 是变长编码)

而 Java 中的 char 本质上是 UTF-16 编码。而 UTF-16 实际上也是一个变长编码(2 字节或 4字节)。

如果一个抽象的字符在 UTF-16 编码下占 4 字节,显然它是不能放到 char 中的。换言之, char 中只能放 UTF-16 编码下只占 2 字节的那些字符。

而 getBytes 实际是做编码转换,你应该显式传入一个参数来指定编码,否则它会使用缺省编码来转换。

你说“ new String("字").getBytes().length 返回的是3 ”,这说明缺省编码是 UTF-8.如果你显式地传入一个参数,比如这样“ new String("字").getBytes("GBK").length ”,那么返回就是 2.

你可以在启动 JVM 时设置一个缺省编码,

假设你的类叫 Main,那么在命令行中用 java 执行这个类时可以通过 file.encoding 参数设置一个缺省编码。比如这样:java -Dfile.encoding=GBKMain这时,你再执行不带参数的 getBytes() 方法时,new String("字").getBytes().length 返回的就是 2 了,因为现在缺省编码变成 GBK 了。当然,如果这时你显式地指定编码,new String("字").getBytes("UTF-8").length 返回的则依旧是 3.

否则,会使用所在操作系统环境下的缺省编码。

通常,Windows 系统下是 GBK,Linux 和 Mac 是 UTF-8.但有一点要注意,在 Windows 下使用 IDE 来运行时,比如 Eclipse,如果你的工程的缺省编码是 UTF-8,在 IDE 中运行你的程序时,会加上上述的 -Dfile.encoding=UTF-8 参数,这时,即便你在 Windows 下,缺省编码也是 UTF-8,而不是 GBK。

由于受启动参数及所在操作系统环境的影响,不带参数的 getBytes 方法通常是不建议使用的,最好是显式地指定参数以此获得稳定的预期行为。

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

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

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

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

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

  3. ORACLE中一个字符占多少字节?

    1.首先查看数据库的字符集是多少? 通过 select userenv('language') from dual;命令查询. 2.不同的字符集,字符占字节大小不一样 utf-8字符集 一个字符占3个 ...

  4. utf-8的英文字母和中文汉字是一个字符占几个字节

    转自https://blog.csdn.net/kindsuper_liu/article/details/80202150 英文字母和中文汉字在不同字符集编码下的字节数 英文字母: 字节数 : 1; ...

  5. Tips:一个字符占几个字节?

    <JAVA啃骨头>之 Javascript 章节 Tips:一个字符占几个字节? ASCII码: 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.一个二进制数字序 ...

  6. 一个字符占几个字节?

    一般来说,一些编程语言或者编译器都有自己的默认编码方式,存储方式,以及编辑器的解码方式,因此,不同的环境需要针对性的使用. 一个字符占几个字节?答案:一:在ASCII码编码方案中,一个英文字符占用一个 ...

  7. utf-8的中文,一个字符占几个字节

    utf-8的中文,一个字符占几个字节 https://blog.csdn.net/kindsuper_liu/article/details/80202150 英文字母和中文汉字在不同字符集编码下的字 ...

  8. utf-8的中文是一个字符占几个字节

    英文字母和中文汉字在不同字符集编码下的字节数 英文字母: ·字节数 : 1;编码:GB2312 字节数 : 1;编码:GBK 字节数 : 1;编码:GB18030 字节数 : 1;编码:ISO-885 ...

  9. Oracle中一个汉字占几个字节

    Oracle中一个汉字占几个字节? 某天,在向一个字段类型为CHAR(6)的表中插入数据'大沽口'时报错,提示'too large for column(actual: 9 ,maximum: 6)' ...

最新文章

  1. java与c/c++之间的数据交互-----jni点滴
  2. 转载:VMware workstation创建虚拟机,安装Ubuntu系统
  3. SVM入门(八)松弛变量
  4. 解决m2eclipse需要jdk的错误
  5. winform进度条实现
  6. properties配置文件的加密
  7. linux下使用vi操作
  8. 通过Discuz!搭建一个主题社区
  9. java集合框架 改写_Java集合框架1
  10. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(光度学—自由灯光、目标灯光、天空门户)图文教程之详细攻略
  11. Typora免费版,不是破解版,是没有升级的老版本,用的还是比较舒服的
  12. 计算机网络网线制作与测试结果,网线制作和测试
  13. echart视觉引导线的长度调节labelLine
  14. 酒店预订的 响应真的很繁杂
  15. 设计模式:仲裁者(Mediator)模式
  16. 数字证书原理[转载]
  17. pytorch中dataloader的num_workers参数
  18. unity 导出 ios 项目运行在模拟器
  19. 事件分发机制怎么回答,不断提升自己创造溢价的能力,附带学习经验
  20. 小布老师讲座笔记(四)

热门文章

  1. 7-24 树种统计 (25 分)
  2. 关于内存释放自己的见解
  3. JS清除所有 Cookie
  4. 前端百题斩【010】——通俗易懂的JavaScript执行上下文
  5. 面向对象游戏案例:贪吃蛇
  6. web前端入门必读书籍
  7. 小马哥----高仿三星i8552刷机 详细拆机主板图与开机界面图。2015新主版机 4.12系统
  8. HDU-3833 YY's new problem
  9. StoreFile Compaction
  10. soft_nms实现