2014-01-05 85 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