浏览 2604 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-03
最后修改:2009-03-25
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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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位的吧。 谢谢, 给个回答哦:) |
|
返回顶楼 | |
发表时间: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)); 是会输出好的。。。 |
|
返回顶楼 | |
发表时间: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的实现问题。 不是同一个概念。 |
|
返回顶楼 | |
发表时间:2009-01-03
最后修改: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的实现。谈的是一种文件的格式规范。 |
|
返回顶楼 | |
发表时间:2009-01-03
jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个
|
|
返回顶楼 | |
发表时间:2009-01-03
jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个
|
|
返回顶楼 | |
发表时间:2009-01-03
mikeandmore 写道 jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个
我不知道应该对你说什么好 |
|
返回顶楼 | |
发表时间:2009-01-03
frenchmay 写道 mikeandmore 写道 jvm-spec里面指出一定是utf8的,嗯。不过utf-8的确是3个长度的。。。而不是两个
我不知道应该对你说什么好 木有看完。。。囧。。。 |
|
返回顶楼 | |