`
frenchmay
  • 浏览: 229130 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入java虚拟机第5章, class文件常量池中字符串类urf8格的存储格式

阅读更多

java虚拟机在class文件中对应类型的常量池中使用了一种类似utf8格式的变体来存储一个常量字符串。

(这里请不要和java se的string api搞混淆,这里谈的是class文件的文件格式问题,我这里只是感觉这种方式比较节省空间,故拿出来请大家看一下。)

 

 

utf-8编码模式允许字符串中的所有unicode字符以2个字节的形式表示,而ascii码(空字符null除外)以一个字节表示。

 

从'\u0001’到'、'\u007f'的所有字符都使用一个字节表示。

字节0: 0 6543210

 

空字符null('\u0000')和从'\u0080'到'\u07ff'的所有字符使用两个字节表示。

字节0:1 1 1   10 9 8 7 6

字节1:1 0 5 4 3 2 1 0

 

从'\u0800'到'\uffff'的所有字符使用3个字节表示。

字节0:1 1 1   15 14 13 12

字节1:1 0 11 10 9 8 7 6

字节2:1 0 5 4 3 2 1 0

分享到:
评论
8 楼 mikeandmore 2009-01-03  
frenchmay 写道
mikeandmore 写道
jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个

我不知道应该对你说什么好

木有看完。。。囧。。。
7 楼 frenchmay 2009-01-03  
mikeandmore 写道
jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个

我不知道应该对你说什么好
6 楼 mikeandmore 2009-01-03  
jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个
5 楼 mikeandmore 2009-01-03  
jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个
4 楼 frenchmay 2009-01-03  
public static void main(String[] args) {
// TODO Auto-generated method stub
String string = "hello";
char c = string.charAt(1);
System.out.println(string.length());
System.out.println(c);
System.out.println((byte)c);
string = "你好";
System.out.println(string.length());
c = string.charAt(1);
System.out.println(c);
System.out.println((byte)c);
}

我主题帖谈的不是上的类似的api的实现。谈的是一种文件的格式规范。
3 楼 frenchmay 2009-01-03  
sdh5724 写道
从'\u0800'到'\uffff'的所有字符使用3个字节表示。

字节0:1 1 1   15 14 13 12

字节1:1 0 11 10 9 8 7 6

字节2:1 0 5 4 3 2 1 0


那我获得一个char怎么办?
比如:
char c = string.charAt(i);
char在java里的定义是16位的吧。 谢谢, 给个回答哦:)


更正一点,我这里描述的方法是java的class文件的类型属性的常量池中字符串存储的方式。

而你举的例子是java string api的字符串的实现和使用。

我这里谈的是java虚拟机规范中class文件结构和格式如何定义的问题。
你谈的是j2se的字符串api的实现问题。

不是同一个概念。
2 楼 mikeandmore 2009-01-03  
sdh5724 写道
从'\u0800'到'\uffff'的所有字符使用3个字节表示。

字节0:1 1 1   15 14 13 12

字节1:1 0 11 10 9 8 7 6

字节2:1 0 5 4 3 2 1 0


那我获得一个char怎么办?
比如:
char c = string.charAt(i);
char在java里的定义是16位的吧。 谢谢, 给个回答哦:)




我怎么记得utf-8非ascii长度是3。。。
不过jvm的constant-pool不太清楚,但是记得spec里面说过是utf-8的。。。。

对于char的问题,大小应该和locale有关。比如我这里是utf-8的环境,那么就是3。

System.out.println("你好".charAt(1));

是会输出好的。。。
1 楼 sdh5724 2009-01-03  
从'\u0800'到'\uffff'的所有字符使用3个字节表示。

字节0:1 1 1   15 14 13 12

字节1:1 0 11 10 9 8 7 6

字节2:1 0 5 4 3 2 1 0


那我获得一个char怎么办?
比如:
char c = string.charAt(i);
char在java里的定义是16位的吧。 谢谢, 给个回答哦:)



相关推荐

Global site tag (gtag.js) - Google Analytics