-
概述
本文主要包括以下幾個面向:編碼基本知識,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)!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

本文解釋了用於構建分佈式應用程序的Java的遠程方法調用(RMI)。 它詳細介紹了接口定義,實現,註冊表設置和客戶端調用,以解決網絡問題和安全性等挑戰。

本文詳細介紹了用於網絡通信的Java的套接字API,涵蓋了客戶服務器設置,數據處理和關鍵考慮因素,例如資源管理,錯誤處理和安全性。 它還探索了性能優化技術,我

本文詳細介紹了創建自定義Java網絡協議。 它涵蓋協議定義(數據結構,框架,錯誤處理,版本控制),實現(使用插座),數據序列化和最佳實踐(效率,安全性,維護


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境