mingyang2013 2010-08-27 10:32
浏览 230
已采纳

编码问题

大家好,请教个问题:

String s="abc你好";

byte[] by=s.getBytes();

输出by.length();

在系统默认编码为GBK是输出7;
在系统默认编码为utf-8时输出9;

我的疑问:
(1)"abc你好"保存为gbk源码时,"abc"各一个字节,"你好"各两个字节,共7个字节,而保存为utf-8源码时,"abc"各一个字节,"你好"各3个字节,共9字节,这些我都能理解。

      (2)但是源程序被编译成字节码后,s到了java程序中,都是以unicode编码标识的,每个字符是2个字节,s.getBytes()是怎样把s编成字节数组的呢,是针对的unicode编码呢,还是默认编码呢?如果是针对unicode,怎么会在不同默认编码下有不同结果呢?如果是针对默认编码,但程序执行的是字节码,源文件都被编译了,干嘛还针对默认编码呢?

唉,糊涂了!

请详细解释一下!最好是对编码过程有个介绍,谢谢!

  • 写回答

2条回答 默认 最新

  • weixin_42525443 2010-08-27 12:27
    关注

    java内部是使用char类型来处理字符串的,使用String.toCharArray() 返回的长度都是一样的

    1.编译程序在读.java文件的时候会已一定的编码读取比方说GBK/UTF-8
    类似String s=new String(byteArrayFromFile,"GBK") 对GBK文件,"abc你好"为7个byte
    String s=new String(byteArrayFromFile,"UTF-8") 对UTF-8文件,"abc你好"为9个byte
    不管哪种方式读进来,都是用char[]cs=s.toCharArray()表示,其长度都是5

    2.编译后在写.class文件时内
    byte[] bs=String.getBytes("UTF-8");//.class文件内部使用的是UTF-8的byte []保存字符串. "abc你好"为9个byte
    outputStream.write(bs);

    所以针对相同内容不同编码的文件,其编译之后的结果是一样的。

    默认编码应该在进行String类操作的时候会用到
    比方说从byte[] -> String 或者 String -> byte[]
    最简单的列子就是从文件读取字符串,一定要指定编码,否则不同环境下的默认编码不同会导致结果不同.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀