zoukankan      html  css  js  c++  java
  • 关于java中char占几个字节,汉字占几个字节

    我们平常说,java中char占2个字节,可又说汉字在不通的编码格式中所占的位数是不同的,比如gbk中汉字占2个字节,utf8中多数占3个字节,少数占4个。而所有汉字在java程序中我们都可以简单的用 char c = '字' 表示; 那么问题来了,在java程序运行的时候,究竟汉字占几个字节呢?
    --------------------------
    在讨论这个问题之前,我们需要先区分unicode和UTF。
    1、unicode :统一的字符编号,仅仅提供字符与编号间映射。符号数量在不断增加,已超百万。详细:[https://zh.wikipedia.org/zh-cn/Unicode]
    2、UTF :unicode转换格式 (unicode transformation format) 。定义unicode中编号的编码方式。utf8和utf16便是其中两种实现方式。其中utf8为变长表示,长度可能时1~6个字节;utf16为变长表示,长度可能是2或4个字节。详细:UTF8 [https://zh.wikipedia.org/zh-cn/UTF-8] UTF16 [https://zh.wikipedia.org/zh-cn/UTF-16]
    接着,要分清内码(internal encoding)和外码(external encoding)。
    1、内码 :某种语言运行时,其char和string在内存中的编码方式。
    2、外码 :除了内码,皆是外码。
    要注意的是,源代码编译产生的目标代码文件(可执行文件或class文件)中的编码方式属于外码。
    先看一下内码
    JVM中内码采用UTF16。早期,UTF16采用固定长度2字节的方式编码,两个字节可以表示65536种符号(其实真正能表示要比这个少),足以表示当时unicode中所有字符。但是随着unicode中字符的增加,2个字节无法表示所有的字符,UTF16采用了2字节或4字节的方式来完成编码。Java为应对这种情况,考虑到向前兼容的要求,Java用一对char来表示那些需要4字节的字符。所以,java中的char是占用两个字节,只不过有些字符需要两个char来表示。
    详细:
    外码
    Java的class文件采用UTF8来存储字符,也就是说,class中字符占1~6个字节。
    Java序列化时,字符也采用UTF8编码,占1~6个字符。
    总结:
    1、java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。
    2、java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。
    3、UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。
    4、UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。
    ----------------------------------------------
    综上,java运行时采用utf16编码,多数汉字占2个字节,一个char就够了,少数占4个字节,需要两个char来表示。
    说明:utf16中,通常汉字2字节,CJKV扩展B区、扩展C区、扩展D区的汉字占4个字节。

  • 相关阅读:
    谷歌 chrome 和 safari 浏览器 td innerHTML Textbox 部分显示不全
    SQLServer 日期转换字符串格式
    GNU 通用公共授權 第三版
    程序员的十个层次 你属于哪一层?
    一个因为缺少括号()引发的SQL存储过程不能执行的问题。
    关于实现字符串表达式求值
    Windows api数据类型【转载】
    x86—EFLAGS寄存器详解【转载】
    python PIL图像处理
    python学习笔记
  • 原文地址:https://www.cnblogs.com/nevermorewang/p/7808092.html
Copyright © 2011-2022 走看看