`
frenchmay
  • 浏览: 232566 次
  • 性别: 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位的吧。 谢谢, 给个回答哦:)



相关推荐

    25个urf格式皮肤

    urf是User Interface Resource Format(用户界面资源格式)的缩写,它是一种定制的二进制文件格式,用于存储用户界面的各个组件,如按钮、菜单、对话框等的外观定义。urf文件由设计师创建,可以包含多个主题和样式,...

    urf格式的软件皮肤

    urf格式的软件皮肤是一种专为定制用户界面设计的文件格式,它允许软件开发者为他们的应用程序提供多样化的视觉体验。这种格式通常包含了一系列图形元素,如按钮、菜单、窗口背景等,用户可以根据自己的喜好来更换,...

    IDEA支持带BOM的UTF-8编码文件的解决方案

    那么用压缩工具处理你的DEA安装目录下lib文件夹中的ecj-x.x.x.jar文件(名字根据IDEA版本会有所不同),将Util.class替换该jar包目录中\org\eclipse\jdt\internal\compiler\util路径下的Util.class文件即可 ...

    discuz x 1.5 urf-8 中文

    X 1.5 URF-8中文版中,这一编码方式确保了论坛能够流畅地展示各种语言内容,满足不同地域用户的需求。 首先,我们来看"utility"文件夹。这个文件夹通常包含了 Discuz! X 1.5 的工具和实用程序,例如数据库维护工具...

    URF-R330开发包

    8. **跨平台兼容性**:由于开发包中提到了C#,意味着URF-R330的驱动和API可能设计为跨平台兼容,允许在多种操作系统(如Windows、Linux、Android等)上运行。 总之,URF-R330开发包提供了一套完整的工具,帮助...

    编码gbk urf-8 unicode相互转换

    编码gbk urf-8 unicode相互转换

    明华开发包URF-R330.rar

    《明华开发包URF-R330:深入解析读卡器技术与应用》 在IT领域,数据传输和信息交换扮演着至关重要的角色。在这个过程中,读卡器作为连接外部存储设备(如SD卡、MMC卡等)与计算机的重要接口,发挥着不可或缺的作用...

    明华URF-R330读卡器C#代码示例

    在IT行业中,与硬件设备交互是常见的任务,特别是在嵌入式系统或物联网(IoT)应用中。明华URF-R330是一款用于读取卡片数据的设备,常用于门禁控制、考勤系统或者身份识别等场景。在这款设备的使用中,开发者通常需要...

    URF-R330非接触式读写器(无驱)演示程序及开发包

    URF-R330非接触式读写器是一款先进的设备,专为无驱动操作设计,使得用户能够在无需安装额外驱动程序的情况下直接进行RFID(射频识别)操作。这款读写器支持非接触IC卡,提供了高效、便捷的卡片读取和写入功能,广泛...

    佳能 URF II LT驱动

    佳能URF II LT驱动是针对佳能激光打印机的一款重要软件组件,它的主要功能是为打印机提供必要的控制指令,使得计算机能够与打印机进行有效通信,完成打印任务。这个驱动程序支持简体中文,并且兼容32位和64位操作...

    c#重写明华URF-R330读写器Demo

    在IT行业中,RFID(Radio Frequency Identification)技术广泛应用于数据采集和识别,而明华URF-R330是一款常见的RFID读写器。本文将详细介绍如何使用C#语言重写明华URF-R330读写器的Demo,以便更清晰、高效地与该...

    明华读卡器URF-R330 开发包

    **明华URF-R330读卡器开发包详解** 明华URF-R330是一款由明泰公司推出的高性能读卡器,主要用于各种智能卡的读取和数据处理。这款读卡器广泛应用于金融、电信、公共服务、门禁控制等领域,其强大的功能和稳定性受到...

    URF-35读写器驱动.rar

    URF-35读写器驱动 1.打开Driver文件夹,阅读“驱动程序安装说明.txt”安装USB口驱动。 2.安装URF35-LT.EXE开发套件。 \API\ 读写器开发动态库 \APIManual\ API开发手册 \Demo\ 读写器操作演示Demo \Examples\...

    明华URF-35H读卡器 C#读写源码 为大家提供 原创

    标题中的“明华URF-35H读卡器 C#读写源码 为大家提供 原创”表明这是一个关于使用C#编程语言与明华URF-35H读卡器进行数据交互的原创代码示例。这个读卡器可能是用于接触式或非接触式IC卡操作,如RFID技术,常见于...

    明华URF-35LT 读卡器的C# 程序例子

    在IT行业中,尤其是在嵌入式系统和物联网应用领域,射频识别(RFID)技术扮演着重要的角色。明华URF-35LT是一款广泛应用的RFID读卡器,它支持多种RFID协议,适用于各种读卡应用场景。本文将详细讨论如何使用C#语言与...

    URF-R330读取序列号VB源代码

    为了深入了解这个VB源代码的工作原理,你需要打开提供的"URF-R330读取序列号VB源代码"文件,仔细阅读和分析代码。如果遇到不理解的部分,可以查阅相关的VB编程文档、URF-R330的开发者手册,以及M1卡协议的资料。通过...

    明华IC卡URF-R330开发包

    同时,开发包中可能还包括详细的用户手册和技术文档,这些资料详细解释了URF-R330的工作原理、硬件接口、通信协议、错误代码等内容,是深入学习和解决问题的关键参考。对于初学者,建议从阅读这些文档开始,以建立对...

    java 解决异常 2 字节的 UTF-8 序列的字节2 无效的问题

    在Java编程中,当处理UTF-8编码的字符串或文件时,可能会遇到“2字节的UTF-8序列的字节2无效”的异常。这个问题通常出现在解析XML文档时,因为XML解析器在读取文件时遇到了无法识别的字节序列,这可能是由于文件编码...

    深圳明华URF R330读卡器 M1卡读写程序 VC6.0.rar

    【深圳明华URF R330读卡器 M1卡读写程序 VC6.0】是一款专为M1卡片设计的读写程序,适用于Windows操作系统下的Visual C++ 6.0开发环境。该程序提供了对M1卡(通常指非接触式IC卡,如恩智浦的Mifare Classic系列)进行...

    URF24xxQB-100WR3

    ### URF24xxQB-100WR3 DC/DC模块电源知识点解析 #### 一、产品概述 URF24xxQB-100WR3是一款由广州金升阳科技有限公司研发与生产的高性能DC/DC转换器,属于URF24_QB-100W(F/H)R3系列。该系列电源模块具有宽输入电压...

Global site tag (gtag.js) - Google Analytics