Java语言中一个字符占几个字节?「建议收藏」

Java语言中一个字符占几个字节?「建议收藏」要区分清楚内码(internalencoding)和外码(externalencoding)就好了。内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String…

大家好,又见面了,我是你们的朋友全栈君。

要区分清楚内码(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 -D
file.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 中运行你的程序时,会加上上述的 -D
file.encoding=
UTF-8 参数,这时,即便你在 Windows 下,缺省编码也是 UTF-8,而不是 GBK。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153124.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 空格的正则表达式

    空格的正则表达式在正则表达式想使用空格的时候不能采用\s的方法,因为\s指的是空白,就是所有空白。如果想表示单纯的空格的话可以采用:[]方括号本身就是匹配其中的字符,那么其中放空格就是匹配空格;如果有其他正则表达式问题可以查看:https://blog.csdn.net/cao849861802/article/details/102505834…

    2025年11月28日
    8
  • AngularJS简介

    AngularJS简介AngularJS简介AngularJS是一个JavaScript矿建,他是一个JavaSscript编写的库。可以通过<script>标签添加到HTML页面。AngularJS是通过指令扩展了HTML,且通过表达式绑定数据到HTML。地址:<scriptsrc="http://apps.bdimg.com/libs/angular.js/1.4.6/angul…

    2022年7月25日
    7
  • 免费接收邮箱短信「建议收藏」

    免费接收邮箱短信「建议收藏」
    如果你的手机号是移动的卡,请登录http://mail.10086.cn/,注册一个139邮箱。
    注册成功后,
    设置——邮件到达通知——开启——长短信
     
    这样就可拥有了一个免费的手机邮箱了,可以免费接收邮箱短信,可以支持350字。
     
     
     
     
    若您还拥有其它的常用邮箱,可以设置一个自动转发啊。

    2022年10月10日
    3
  • pycharm导入模块出错_regsvr32模块加载失败

    pycharm导入模块出错_regsvr32模块加载失败Pycharm项目中,导入模块出现下列情况时,说明Appium-Python-Client没有安装解决方法:1、WIN键+R,输入CMD回车输入pipinstallAppium-Python-Client2、这个时候打开Pycharm,重新输入fromappiumimportwebdriver,仍旧没有成功。是因为你的项目没有添加这个库,还需要以下步骤搜索出Appium-Python-Client,点击添加回到刚才的页面,可以发现已经添加成功了,这时候点击ok即可模块也导

    2025年8月15日
    4
  • Linux更改文件权限命令「建议收藏」

    Linux更改文件权限命令「建议收藏」chmod命令1、格式:chmod【-cfvR】【–help】【–version】modefile2、参数1)必要参数-c当发送改变时,报告处理信息-f错误信息不输出-R处理指定目录以及其子目录下的所有文件-v运行时显示详细处理信息2)选择参数–reference=<目录或者文件>:设置成具有指定目录或文件具有相同的权限–version:显示版本信息<权限范围>+<权限设置>:使权限范围内的目录或文件具有指定的权限<

    2025年10月28日
    3
  • php用空格分隔字符串,分割字符串空格[通俗易懂]

    php用空格分隔字符串,分割字符串空格[通俗易懂]【java易错点】javasplit分割字符串空格问题解析Strings=”@123.com”;String[]data=s.split(“@”);//以@分割字符串,获得@后的值。运行结果如下data[0]:””;data[1]:123.com;此时,你会发现,data数组里面存储的第一个元素是一个空格…文章落雨_2012-02-14832浏览量python…

    2025年6月1日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号