2014-01-05 86 views
1

请参阅JLS7。第3.2节页使用UTF-16编码16个状态使用Java编码编程语言

Java编程语言表示的16位代码单元的序列文本, 。

我解散了一个hello世界程序。

class Y { 
String hello = "hello"; 
} 

以下是大会:

Classfile /c:/Work/SR1/e2/tmp/Y.class 
Last modified Jan 5, 2014; size 240 bytes 
MD5 checksum 96694fda4f346a62d5412c56dc36c45d 
Compiled from "X.java" 
class Y 
    SourceFile: "X.java" 
    minor version: 0 
    major version: 52 
    flags: ACC_SUPER 
    Constant pool: 
    #1 = Class    #2    // Y 
    #2 = Utf8    Y 
    #3 = Class    #4    // java/lang/Object 
    #4 = Utf8    java/lang/Object 
    #5 = Utf8    hello 
    #6 = Utf8    Ljava/lang/String; 
    #7 = Utf8    <init> 
    #8 = Utf8    ()V 
    #9 = Utf8    Code 
    #10 = Methodref   #3.#11   // java/lang/Object."<init>":()V 
    #11 = NameAndType  #7:#8   // "<init>":()V 
    #12 = String    #5    // hello 
    #13 = Fieldref   #1.#14   // Y.hello:Ljava/lang/String; 
    #14 = NameAndType  #5:#6   // hello:Ljava/lang/String; 
    #15 = Utf8    LineNumberTable 
    #16 = Utf8    SourceFile 
    #17 = Utf8    X.java 
    { 
    ... 

我只看到UTF8编码,没有UTF16。为什么没有Utf16编码。

由于

+3

因为...你的字符集是UTF8。字符串*内部*是持有16位码点。 –

+0

类型在你的字符串常量中放入一些中文字符并查看它所反转的内容 – Bohemian

+0

如何将电文置于文本文件中? – gudge

回答

5

在一个执行程序,文本是(通常)表示在UTF-16。

但是在“.class”文件中,常量池中的文本(即字符串文字,标识符等)以UTF-8编码以节省空间。 (UTF-8中的常量池条目的编码由JVM spec - Section 4.4规定...并且与默认字符集无关。)

当加载类文件时,UTF-8常量池条目被转码为UTF-16由类加载器提供。


1 - 应用程序可以被写入到无数不同的方式编码文本。我们在这里讨论的UTF-16编码是用于Java中文本数据的自然编码方案;即您在存储文本StringCharacterSequence的任何其他子类型时获得的编码。

+0

在类文件的常量池中,对于字符串也没有其他编码:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4 – Charlie

+0

@查理 - 对。 (我假设你指的是Brian Roach的误导性评论......) –

+0

是的。自从该问题引用JLS规范以来,还认为应该提供指向JVM规范相关部分的链接。 – Charlie