首頁 Java java教程 基礎入門-JAVA字元集詳解

基礎入門-JAVA字元集詳解

Dec 17, 2016 am 11:01 AM

  1.  概述 

    本文主要包括以下幾個面向:編碼基本知識,java,系統軟體,url,工具軟體等。 

        在下面的描述中,將以"中文"兩個字為例,經查表可以知道其GB2312編碼是"d6d0 cec4",Unicode編碼為"4e2d 6587",UTF編碼就是"e4b8ad 注重,這兩個字沒有iso8859-1編碼,但可以用iso8859-1編碼來"表示"。 

    2. 編碼基本知識 

        最早的編碼是iso8859-1,類似ascii編碼。但為了方便表示各種各樣的語言,逐漸出現了許多標準編碼,重要的有以下幾個。 

    2.1. iso8859-1 

        屬於單字節編碼,最多能表示的字元範圍為0-255,應用於英文系列。例如,字母'a'的編碼為0x61=97。 

        很明顯,iso8859-1編碼所表示的字元範圍很窄,無法表示中文字元。但是,由於是單字節編碼,和電腦最基礎的表示單位一致,所以很多時候,仍然使用iso8859-1編碼來表示。而且在很多協定上,預設使用該編碼。例如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字符,使用iso8859-1編碼的時候則將它拆開為4個字節來表示:"d6 d0 ce c4"(事實上,在進行儲存的時候,也是以位元組為單位處理的)。而假如是UTF編碼,則是6個位元組"e4 b8 ad e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎。 

    2.2. GB2312/GBK 

        這是漢子的國標碼,專門用來表示漢字,是雙位元組編碼,而英文字母和iso8859-1一致(相容於iso8859-1)。其中gbk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是相容gb2312編碼的。 

    2.3. unicode 

        這是最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,包括英文字母在內。所以可以說它是不相容iso8859-1編碼的,也不相容於任何編碼。不過,相對於iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節,例如字母'a'為"00 61"。 

    需要說明的是,定長編碼便於電腦處理(注重GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟體內部是使用unicode編碼來處理的,例如java。 

    2.4. UTF 

        考慮到unicode編碼不相容於iso8859-1編碼,輕易佔用更多的空間:因為對於英文字母,unicode也需要兩個位元組來表示。所以unicode不便於傳輸和儲存。因此而產生了utf編碼,utf編碼相容iso8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,utf編碼自備簡單的校驗功能。一般來講,英文字母都是用一個位元組表示,而漢字使用三個位元組。 

        注重,雖然說utf是為了使用更少的空間而使用的,但那隻是相對於unicode編碼來說,假如已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對於漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包含了很多的英文字符。 

    3. java對字符的處理 

        在java應用軟體中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。 

    3.1. getBytes(charset) 

       這是java字串處理的一個標準函數,其作用是將字串所表示的字元依照charset編碼,並以位元組方式表示。注重字串在java記憶體中總是按unicode編碼儲存的。例如"中文",正常情況下(即沒有錯誤的時候)儲存為"4e2d 6587",假如charset為"gbk",則被編碼為"d6d0 cec4",然後返回位元組"d6 d0 ce c4"。假如charset為"utf8"則最後是"e4 b8 ad e6 96 87"。假如是"iso8859-1",則由於無法編碼,最後返回 "3f 3f"(兩個問號)。 

    3.2. new String(charset) 

        這是java字串處理的另一個標準函數,和上一個函數的作用相反,將位元組數組依照charset編碼進行組合識別,最後轉換為unicode儲存。參考上述getBytes的例子,"gbk" 和"utf8"都可以得到正確的結果"4e2d 6587",但iso8859-1最後變成了"003f 003f"(兩個問號)。 

        因為utf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。 

    3.3. setCharacterEncoding() 

        此函數用來設定http請求或對應的編碼。 

         對於request,是指提交內容的編碼,指定後可以透過getParameter()則直接獲得正確的字串,假如不指定,則預設使用iso8859-1編碼,需要進一步處理。參見下述"表單輸入"。值得注重的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。 java doc上說明:This method must be called PRior to reading request parameters or reading input using getReader()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應該是在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容,而後續的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對於GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析所有的提交內容,setCharacterEncoding()自然就無效。 

        對於response,則是指定輸出內容的編碼,同時,設定會傳遞給瀏覽器,告訴瀏覽器輸出內容所採用的編碼。 

    3.4. 處理過程 

    下面分析兩個代表性的例子,說明java對編碼有關問題的處理方法。

    3.4.1. 表單輸入 

         input  *(gbk:d6d0 cec4)  browser  *(gbk:d6d0 cec4)  browser  *(gbk:d6d0 cec4)  browser  *(gbk:d6d0 cec4)  browser  *(gbk:d6d6d 0ce 00c4)  class,需要在class中處理:getbytes(" iso8859-1")為d6 d0 ce c4,new String("gbk")為d6d0 cec4,記憶中以unicode編碼則為4e2d 6587。 

    l 使用者輸入的編碼方式和頁面指定的編碼有關,也和使用者的作業系統有關,所以是不確定的,上例以gbk為例。 

        從browser到web server,可以在表單中指定提交內容時所使用的字元集,否則會使用頁面指定的編碼。而假如在url中直接用?的方式輸入參數,則其編碼往往是作業系統本身的編碼,因為這時和頁面無關。上述仍以gbk編碼為例。 

        Web server接收到的是位元組流,預設時(getParameter)會以iso8859-1編碼處理之,結果是不正確的,所以需要處理。但假如預先設定了編碼(透過request. setCharacterEncoding ()),則能夠直接取得到正確的結果。 

        在頁面中指定編碼是個好習慣,否則可能失控,無法指定正確的編碼。 


 以上就是基礎入門-JAVA字符集詳解的內容,更多相關文章請關注PHP中文網(www.php.cn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的平方根 Java 中的平方根 Aug 30, 2024 pm 04:26 PM

Java 中的平方根指南。下面我們分別透過例子和程式碼實作來討論平方根在Java中的工作原理。

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的阿姆斯壯數 Java 中的阿姆斯壯數 Aug 30, 2024 pm 04:26 PM

Java 中的阿姆斯壯數指南。這裡我們討論一下java中阿姆斯壯數的介紹以及一些程式碼。

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 隨機數產生器指南。在這裡,我們透過範例討論 Java 中的函數,並透過範例討論兩個不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

See all articles