如何理解java采用Unicode编码
http://blog.csdn.net/gjb724332682/article/details/43229563
?
Java中字符僅以一種形式存在,那就是Unicode。由于java采用unicode編碼,char 在java中占2個字節。2個字節(16位)來表示一個字符。
這里的Java中是指在JVM中、在內存中、在代碼里聲明的每一個char、String類型的變量中。
例如:
?
[java]?view plaincopy也就是說,只要我們正確地讀入了漢字“永”字,那么它在內存中的表示形式一定是0x6c38,沒有其他任何值能替代這個字。
JVM的折中約定使得一個字符分為兩部分:JVM內部和OS的文件系統。在JVM內部,統一使用Unicode表示,當這個字符被從JVM內部移到外部(即保存為文件系統中的一個文件的內容時),就進行了編碼轉換,使用了具體的編碼方案。因此可以說所有的編碼轉換只發生在邊界的地方,JVM和OS的交界處,也就是各種輸入/輸出流(或者Reader,Writer類)起作用的地方。
所有的I/O基本上可以分為兩大陣營:面向字符的輸入/輸出流;面向字節的輸入/輸出流。如果面向字節,那么這類工作要保證系統中的文件二進制內容和讀入JVM內部的二進制內容一致,不能變換任何0和1的順序。這種輸入/輸出方式很適合諸如視頻文件或者音頻文件,因為不需要變換任何文件內容。而面向字符的I/O是指希望系統中的文件的字符和讀入內存的“字符”要一致。例如:我們的中文版XP系統上有一個GBK的文本文件,其中有一個“永”字,我們不關心這個字的GBK編碼是什么,只希望在使用面向字符的I/O把它讀入內存并保存在一個char型變量中時,I/O系統不要直接把“永”字的GBK編碼放到這個字符(char)型變量中,我們不關心這個char型變量具體的二進制內容到底是多少,只希望這個字符讀進來之后仍然是“永”字。
從這個意義上可以看出,面向字符的I/O類,也就是Reader和Writer類,實際上隱式做了編碼轉換,在輸出時,將內存中的Unicode字符使用系統默認編碼方式進行了編碼,而在輸入時,將文件系統中已經編碼過的字符使用默認編碼方案進行了還原。這里要注意,Reader和Writer只會使用這個默認的編碼來做轉換,而不能為一個Reader和Writer指定轉換時使用的編碼。這也意味著,如果使用中文版WindowsXP系統,其中存放了一個UTF8編碼的文件,當采用Reader類來讀入的時候,它還會用GBK來轉換,轉換后的內容當然不對。這其實是一種傻瓜式的功能提供方式,對大多數初級用戶(以及不需要跨平臺的高級用戶,windows一般采用GBK,linux一般采用UTF8)來說反而是一件好事。
如果用到GBK編碼以外的文件,就必須采用編碼轉換:一個字符與字節之間的轉換。因此,Java的I/O系統中能夠指定轉換編碼的地方,也就是在字符與字節轉換的地方,那就是InputStremReader與OutputStreamWriter。這兩個類是字節流和字符流的適配器類,它們承擔編碼轉換的任務。
既然java是用unicode來編碼字符,"我"這個中文字符的unicode就是2個字節。String.getBytes(encoding)方法是獲取指定編碼的byte數組表示,通常gbk/gb2312是2個字節,utf-8是3個字節。如果不指定encoding則取系統默認的encoding。
?
[java]?view plaincopy注意,file.encoding在ide和直接用命令行輸出可能不一致,ide比如eclipse,idea等可以配置這個編碼。如下圖的Project Encoding。
由于JDK是國際版的,在編譯的時候,如果我們沒有用-encoding參數指定我們的JAVA源程序的編碼格式,則javac.exe首先獲得我們操作系統默認采用的編碼格式,也即在編譯java程序時,若我們不指定源程序文件的編碼格式,JDK首先獲得操作系統的file.encoding參數(它保存的就是操作系統默認的編碼格式,如WIN2k,它的值為GBK),然后JDK就把我們的java源程序從file.encoding編碼格式轉化為JAVA內部默認的UNICODE格式放入內存中。然后,javac把轉換后的unicode格式的文件進行編譯成.class類文件,此時.class文件是UNICODE編碼的,它暫放在內存中,緊接著,JDK將此以UNICODE編碼的編譯后的class文件保存到我們的操作系統中形成我們見到的.class文件。對我們來說,我們最終獲得的.class文件是內容以UNICODE編碼格式保存的類文件,它內部包含我們源程序中的中文字符串,只不過此時它己經由file.encoding格式轉化為UNICODE格式了。如果IDE設置了file.encoding為UTF-8,那么保存這些代碼的文件編碼就是UTF-8,如果這時候,在編碼為GBK的系統上用javac命令編譯這個類,并執行,那么結果會輸出亂碼。如果在IDE里編譯執行,就不會輸出亂碼。
轉載于:https://www.cnblogs.com/xiaohanlin/p/8107911.html
總結
以上是生活随笔為你收集整理的如何理解java采用Unicode编码的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C语言博客作业--结构体
- 下一篇: 弹出taskeng.exe窗口的解决方法
