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 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器