zoukankan      html  css  js  c++  java
  • 弄清java中的字节与字符

    问题

    在java中,一个字符等于多少字节?

    或者更详细的问:在java中,一个英文字符等于多少字节?一个中文字符等于多少字节?

    答案

    Java采用unicode来表示字符,java中的一个char是2个字节一个中文或英文字符的unicode编码都占2个字节,但如果采用其他编码方式,一个字符占用的字节数则各不相同。

    在 GB 2312 编码或 GBK 编码中,一个英文字母字符存储需要1个字节,一个汉子字符存储需要2个字节

    在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。

    在UTF-16编码中,一个英文字母字符存储需要2个字节,一个汉字字符储存需要3到4个字节(Unicode扩展区的一些汉字存储需要4个字节)。

    在UTF-32编码中,世界上任何字符的存储都需要4个字节。

    举个例子:

    java代码如下:

    String str = "测试test";
    int byte_len = str.getBytes().length;
    int len = str.length();
    System.out.println("字节长度为:" + byte_len);
    System.out.println("字符长度为:" + len);

    如果编码方式为GBK,对于字符串“测试test”,字符长度为6,字节长度为8。

    如果编码方式为UTF_8,对于字符串“测试test”,字符长度为6,字节长度为10

    注意:字符串的length()方法返回的是字符长度,一个汉子表示一个字符,一个字母也表示一个字符。

    unicode和UTF_8有什么关系

    UTF-8就是在互联网上使用最广的一种unicode的实现方式。unicode的其他实现方式还包括UTF-16和UTF-32。

    UTF-8的最大特点是,它是一种可变的编码方式。

    详情请自行百度~

    那么问题来了

    说了这么多还是不明白,到底java中一个char表示几个字节?请看下面解释

        public class Test {  
          
          
            public static void main(String[] args) {  
                String str= "测";  
                char x ='测';  
                byte[] byteStr=null;  
                byte[] byteChar=null;  
                try {  
                    byteStr = str.getBytes("utf-8");  
                    byteChar = charToByte(x);  
                } catch (Exception e) {  
              
                    e.printStackTrace();  
                }  
                System.out.println("byteStr :"+byteStr.length);  
                System.out.println("byteChar:"+byteChar.length);  
            }  
            public static byte[] charToByte(char c) {   
                byte[] b = new byte[2];   
                b[0] = (byte) ((c & 0xFF00) >> 8);   
                b[1] = (byte) (c & 0xFF);   
                return b;   
            }  
        }  

    运行结果:

    byteStr:3
    byteChar:2

      

    java是用unicode来表示字符,"测"这个中文字符的unicode就是2个字节。

     String.getBytes(encoding)方法是获取指定编码的byte数组表示,

    如果不指定encoding则取系统默认的encoding。

  • 相关阅读:
    python脚本netifaces模块的调用
    Remote Desktop Connection Manager介绍
    svn 分支整个项目合并主干
    C#中的 ref 传进出的到底是什么 解惑篇
    TortoiseSVN 安装中文语言包,SVN中文语言包
    CefSharp开源库的使用(一)
    cef 介绍
    SQL Server2008数据库如何改名
    通过公网连接云数据库Memcache--ECS Windows篇
    微信扫码支付模式一和模式二的区别
  • 原文地址:https://www.cnblogs.com/ouym/p/7607399.html
Copyright © 2011-2022 走看看