实际上,我对Java中字符串的编码感到困惑。我有几个问题。如果你知道他们的答案,请帮助我:
1)内存中Java字符串的原生编码是什么?当我写String a ="Hello"时,它将以哪种格式存储?由于Java与机器无关,所以我不认为系统会进行编码。
2)我在网上看到"utf-16"是默认的编码,但我很困惑,因为我在写int a = 'c'时,得到了ASCII表中字符的编号。那么ascii和utf-16是相同的吗?
3)另外,我不确定字符串在内存中的存储依赖于什么:操作系统、语言?
- 你应该考虑把这些问题分解成单独的问题,因为它们真的非常不同。#2可以在这里回答:stackoverflow.com/questions/1490218/…
Java的UTF - 16字符串式的商店。
"默认编码"是不是很好。java字符串存储的UTF - 16编码式外,但使用"默认编码,系统的不同需求,从平台到平台",甚至被改变的东西和可以通过环境变量的一类的在线平台。
ASCII码是一个集(1)是拉丁字符集。UTF-16是Unicode的编码方式。如果你执行你的操作系统是int i = 'x'测试任何ASCII字符范围内的瀑布在你拿到的ASCII码值。utf - 16可以代表很多更多比ASCII字符,但是。
从java.lang.character文档:
The Java 2 platform uses the UTF-16 representation in char arrays and in the String and StringBuffer classes.
这是操作系统的定义是部分的Java平台是Java 2平台的UTF - 16是用于这些类别。
- char和char数组的用法仅为public、string和stringbuffer的外部API定义。字符的内部存储是特定于实现的。
- @Jarnbjo以上是文档的直接引用。Java中的EDCOX1 0数据类型代表一个UTF16代码单元(不是字符,又名Unicode代码点),所以我认为很安全地说Java语言的文本表示是UTF 16。是的,可以想象,一个实现可以选择在封面下做一些不同的事情,但最终它们必须使其看起来就像使用UTF-16一样。
- 由于无法访问String和StringBuffer类的内部存储,因此假设引用的语句应用于它是有意义的。
- UTF-16BE还是UTF-16LE?
- @Hendyirawan-Jana不允许访问单个字节,只允许访问字符(对应于UTF-16代码单元),因此没有set endian。内存中实际使用的endian依赖于JVM/平台,就像内存中用于存储int的endian一样。
1)为对象的字符串,其中包含typically char数组和字符串的长度。常用的字符数组的连续阵列实现的16位字,每一个Unicode字符中含有天然的字节顺序。
2)assigning字符值的一个整数converts 16位Unicode字符代码为其等效的整数。因此,这是一'c',U + 0.063,成为0x0063或99。
3)由于每个String是一个对象,它包含的信息比其他类的成员(例如,类的描述符的信号锁定(Word,Word等)。
adendum
该对象的内容的实现(这取决于JVM的开销决定的固有的每个对象相关联的类),以及如何编码(即是真的,有些比别人更多的图书馆可能是有效的。
——>在典型的实现将两个词每架空配置实例(对象/类描述符的指针,和锁的控制信号;StringWord)中包含了一个对象的长度也intchar[]阵列和参考。当前字符的字符串的内容是存储在第二个对象,char[]阵列,进而是分配给两个字,一个数组的长度加字,加上16位的多char元件所需要的(加上任何额外的字符字符串是挂在左,当字符串被创建)。
附录2 >这是一个代表一个字符的情况仅仅是一个真正的Unicode字符在大多数的情况下。这将意味着真正的UCS-2编码和在2005年。但现在已成为以Unicode编码的字符串有一个较大的是与在使用utf - 16 -病房的Unicode字符可以使用两个单chars String在Java。
看看当前的源代码是在Apache的实现,例如:
http:/ / / / www.docjar.com API的Java /的HTML / string.java.html郎
- 实际上,你打算在你的部分说什么?它包含其他信息,所以……???
- "将字符值赋给整数将16位Unicode字符代码转换为等效的整数。"这里有一点令人困惑的是,前256个字符的Unicode编码与ASCII一致。Unicode与前256个字符的扩展ASCII(8位)相关;而扩展ASCII则与前128个字符的7位ASCII直接对应。所以"c"以Unicode、扩展ASCII和ASCII编码为0x63。这就是为什么你会看到"c"的int,认为它是ASCII(它的排序是:)。
- @霍克耶帕克:是的,7位ASCII(iso 646)和8位iso 8859-1(拉丁语-1)是Unicode的适当子集。也就是说,Java将所有字符值编码为16位Unicode。
- 当然。我只是在为那些可能被重叠混淆的人澄清。
在这回答你的问题,是不是,值得注意的是,……在Java字节码(类文件),字符串是存储在UTF - 8。java.sun.com http:/ / / / /文档/图书/的HTML _ jvm第二版/ classfile.doc.html
- OP询问内存存储,而不是.class文件格式。
- @loadmaster我相信它是一个有用的信息,我明确地提到它是类文件-那么您的问题是什么?
- 但它不能回答这个问题。你可以把它作为评论发表,然后以"虽然这不能回答你的问题,但值得注意的是……"开头,这确实是一条有用的信息,尽管我不知道他们使用的是UTF-8。有什么意义?这意味着JVM必须在启动时将每个字符串转换为UTF-16。
- @Sergey Tachenov:字符串存储为utf-8,因此.class文件较小(平均)。
- 当你把它们放在一个jar文件中时,这一点都不重要,通常是这样做的。UTF-16的压缩效率几乎是它的两倍。
- @谢尔盖·塔切诺夫:大多数时候这可能并不重要,但并不是每个人都以压缩的形式存储JAR文件的内容。不管怎样,我给出的(历史)原因是我从阅读有关.class文件格式的资料中收集到的。
- 如果.class文件是使用javac -encoding ISO-8859-1选项创建的呢?难道不是所有源文件的内容都存储在ISO-8859-1而不是UTF-8中吗?
- PARSECER:Oracel的文档对这种"编码:设置源文件编码名称,如EK-JP和UTF-8"非常严格,所以这只是源文件(*.java)编码,在*.class文件中对字符串的编码保持UTF-8。
编辑:我感谢帮助我的答案是错误的装卸。
1)全是用在内部字符串处理UTF - 16。
ASCII码(2)是一个集utf - 16。
3)式是在Java的UTF - 16。适当的休息,这取决于你在哪里上的,是的。
- 字符串作为char[]存储在内部(内存中),每个元素包含一个16位的utf-16 Unicode字符。UTF-8不用于在内部存储字符串,而是用于将I/O流转换为字符串或从字符串转换为I/O流。
- @装卸工:时间有变化吗?Java总是在UTF 16内部吗?
- 是的,String一直使用内部char[]来存储其字符值。