導航:首頁 > 編程語言 > java系統編碼

java系統編碼

發布時間:2022-12-11 04:48:55

『壹』 java 已知Java系統編碼是GBK,jtextarea從一編碼為Unicode的文本中讀取數據,出現亂碼,怎麼正常顯示

不用那麼麻煩,直接用InputStreamReader(FileInputStream fis,String code)這個函數來讀取文本就可以了,code就是這個文本的編碼

『貳』 java獲取操作系統默認編碼方式

java System.getProperty("file.encoding");
win7 默認是GBK

『叄』 java編碼問題

這種編碼問題真是很tricky的問題。說它tricky是因為這至少涉及到以下4種編碼選取的排列組合(有時甚至更多),更有時乃至會發生錯進錯出,負負得正,中間過程錯了但反而到不是亂碼的情況。

(1)源代碼的編碼
(2)編譯時告訴java編譯器的源代碼編碼
(3)運行時jvm參數file.encoding
(4)輸出終端對輸出位元組流的解碼所採用的碼組

在這簡單情況下(1)和(2)一致,(3)和(4)一致就不會因為編解碼映射錯誤(當然字元向終端字體映射的錯誤是另一回事,如字體缺失之類)。而(1)(2)和(3)(4)不必一致,這樣就使得不必強求開發編譯環境和運行應用環境的編碼必須一致。

源代碼的錄入與編譯若在在一個平台上時,大多數情況沒有問題(反而用聰明的Idea IDE設置錯誤時會亂套,越是簡陋的開發環境越不太會錯)。但是如果你在中文GBK編碼平台上的源代碼在別人的unicode編碼平台上編譯,就有問題了。所以和別人,特別是和不同母語的人合作編程時,建議要麼約定一律用unicode作為源文件編碼;要麼只用ASCII字元,反正其他編碼一般都和ASCII兼容的,對於非ASCII字元,用Java的/uxxxx表示機制,比如"中國"就表示為"\u4e2d\u56fd"。4e2d和56fd分別是中國二字的unicode十六進制編碼。

但我認為樓主在這里其實主要關心的是運行時的編碼一致問題,即(3)和(4)。所以言歸正傳,讓我們來檢查它們是否一致。

由於正如上述,iso8859-1編碼集其實是被其他所有公認的編碼集所兼容的,也就是說它是所有公認編碼集的公共子集。所以以iso8859-1為基礎可以外延到任何一個公認編碼集。事實上大多數情況也是這樣做的。比如java System property里設定了encoding為iso8859-1,事實上不僅僅是一個Latin字母的映射,在非Latin區域按JVM宿主操作系統的編碼擴展。即選iso8859-1其實是選擇了宿主操作系統的默認編碼。

假設樓主的操作系統編碼是GBK,那麼file.encoding=iso8859-1相當於選擇了file.encoding=GBK。那麼System.out.println(...)這個核心類方法會將china字元轉換為file.encoding指定的編碼(GBK)位元組由out流輸出給最終out所綁定的終端。比如console一般採用系統默認編碼也是GBK的話,那就和file.encoding一致,能正常解碼,不會亂碼。

至於System.out.write()直接寫位元組流。由於該位元組流是由china.getBytes()得到的,在不指定編碼的時候使用file.encoding指定的默認值的(即GBK),因此Str->Byte的編碼方法GBK和console採用的解碼方法GBK又是一致的,所以也不是亂碼。

但是這時候用toHexString列印出的兩個位元組串是不一樣的。先直接把china逐字強行轉換為int的情況,不涉及輸出編碼,總是unicode的。(JVM規范規定class里字串必須unicode編碼)只要上述(1) (2)匹配,java編譯器會自動從各種編碼的源文件正確轉成class文件里統一unicode編碼的字串。相反,作為一個題外話提一下,當(1)(2)不匹配時會在特定的一種配合(1)(2)的(3)(4)也不匹配的情況下會負負得正輸出正常,但這是絕對錯誤的做法,因為任何要求(1)(2)和(3)(4)有匹配關系的要求都是在應用中可能無法滿足的。java編譯器對這種情況也會報告warning,但不fail。

綜上,一旦file.encoding設成宿主操作系統默認而系統consle也採用操作系統默認編解碼的話,(3)(4)總是一致的,無論系統選擇的是GBK還是utf-8等等。

那麼如果file.encoding不選系統默認呢?比如utf-8。那就很可能出現亂碼了。但是,慢著,試驗的結果還是沒有亂碼。那是因為file.encoding是靜態的JVM系統參數,在程序里像樓主那樣設定是不起作用的(我不知道有沒有辦法發一個什麼通知讓這種程序改變生效的)。必須作為JVM參數直接傳給java程序讓它構造虛擬機的時候就得到這個參數,否則JVM會去拿宿主系統的默認值,就相當於又回到設file.encoding=iso8859-1了。
java -Dfile.encoding=utf-8 A
這下終於亂碼了,而且兩個都亂了。列印出的位元組串一個還是unicode,另一個從GBK變到utf-8了。

如果你發現試驗的現象和我上面說的正好相反,請注意檢查console的編碼設置,我們上面假設它也採用了宿主系統默認編碼,但有些console很高級的嘞,可以設置成不通編碼的(其實幾乎所有的都可以)。那麼分析的方法和上面一樣,結果可能正好相反。

『肆』 java是用系統默編碼認還是uft-8 bom

開發的時候都是使用utf-8,修改編碼,「Window」->「Preferences」->如下圖:

『伍』 JAVA幾種常見的編碼格式

詳情傳送門至:網頁鏈接

『陸』 java使用unicode為默認編碼是什麼意思

java初學者都會接觸到一個概念,既java的默認編碼是uincode,但書上也就出現這句話而已,究竟是什麼意思就沒再說。其實對於一個程序員來說,一個平台的編碼方式是不用了解的,因為這是他內部處理字元的方式,和我們頂層設計程序是沒有多大關系(如果真要說有關系的話,一個就是你對這個平台的熟悉程度,另一個就只能是你要處理的字元奇葩到要考慮編譯器有沒有包括這個字元)。但這並不是指我們在編程的時候完全不用考慮編碼問題,恰恰相反,編碼問題是跨系統交流的基本。
那java哪裡會用到編碼問題呢?最常見的是流,下面有兩個例子。1.在linux下用java創建了一個文件(這里默認代碼里沒有指定編碼),裡麵包括英文和中文,然後在windows下同樣用java讀取這個文件,並輸出,結果中文出現了亂碼;2.android手機和電腦的兩個java程序進行類似qq的信息交流,中文都是亂碼。疑惑來了,java不是跨平台嗎,而且默認編碼就是unicode,為什麼會有編碼? 正如上面所說,java的系統編碼是管理內部變數等信息的,是統一不能變的,但上面兩個例子出現亂碼的原因在於這些字元信息是從外界讀取的,編碼方式直接影響到字元的顯示,比如gbk一個字元是1或2個位元組,中文是2個,而utf8是1到4個位元組不定,中文是3個,utf16是2個位元組固定不變,所以很明顯了,同樣位元組數的源信息可以每2個或者每3個位元組表達一個中文,不同編碼當然不同了,而且即使gbk和utf16都是兩個位元組表示一個中文,同樣的二進制也對應不同的字元。所以從外部讀取到這些byte信息後,就要指定編碼,比如new
String(byte[],charset),當然,也可以在構建流的時候就指定,像new
InputStreamReader(InputStream,charset)等,但像BufferedReader等沒有相應的構造函數,就只能把上面的InputStreamReader作為參數了。
總結:
1.String和流(包括控制台的輸出輸入)的默認編碼是根據系統而定,即jvm假設這些信息是當前系統創建的,windows默認中文是gbk,linux和mac是utf8(這里又來了,utf8和unicode是什麼意思,簡單地說,unicode是把每個字元和一個唯一的二進制碼對應的標准,而utf是unicode
transformation
format,即如何表示每個唯一的二進制碼,utf8,utf16和utf32是不同的編碼方式);
2.IDE設置的編碼方式用於存取java源文件,對於在不同系統平台上共享代碼很重要;
3.java編譯器採用utf8,即class文件的存儲是用utf8,因為相對於utf16,utf8在處理英文佔用內存小,而程序大部分都是英文;
4.jvm運行時的編碼方式是utf16,即jvm用utf8從class文件讀取程序後再轉化為utf16編碼的字元串,因為utf16是2個位元組,統一的長度更方便jvm申請數組等操作;
5.網頁大部分是用utf8編碼的,在html頭幾行有charset的信息,在對下載下來的網頁進行解析時,要注意編碼,谷歌網路在對搜索結果的解析時也是用utf8的,所以在涉及到網路時編碼問題非常重要,本人曾經栽得很慘,當然了,誰叫windows的編碼不是utf8;
6.不知大家有沒有經歷過,如果編碼弄錯了,一般只有中文會出現亂碼,而中文後面的英文是正確的,不合理啊,這不是類似多骨諾米牌嗎,一個錯了,後面不是全倒嗎。所以別小看那些制定編碼的專家,像utf8每個位元組的前幾位都用來表示一些信息,不同位元組還不一樣,而utf16也有,所以弄出了utf16le和utf16be

『柒』 為什麼java的默認編碼不是utf-8 而是gbk

因為系統是中文語言的,得到的是GBK編碼,所以肯定不是utf的。

工具:

win7

jdk

方法:

  1. 在計算機上右鍵選擇屬性

『捌』 Java中,內存的字元表示的是Java的unicode編碼系統中的文件表示的是系統的默認編碼

1、Java中,字元在內存中是用unicode編碼的

2、系統中的文件默認是用默認編碼編碼的。解釋一下:對於每個語言/區域,比如中文/中國,中文/台灣,英語/美國,英語/英國,系統都指定一個特定的編碼方式,當讀取或保存文件時,如果不指定要使用何種編碼方式或讀取時在文件中找不到編碼方式的識別碼(姑且這么叫吧,作用是幫助識別文件的編碼),就會使用這個特定的編碼方式,這就叫默認以默認編碼方式編碼或解碼。
如果文件中存在一個utf8編碼的文件,Reader類讀入它時,為什麼要使用GBK來轉換呢?因為它笨,它只會使用默認編碼來轉換,而此系統的默認編碼恰好是GBK,如果默認編碼是其它的,它也會選擇那個對應的默認編碼來轉換,不要以為Reader類就不犯錯。所以,使用Java的io類庫時,有時需要自己指定編碼,不要以為Java類為你搞定了一切。回頭想想,Reader類表現得有點欠佳,這也很正常。畢竟,這世上有那麼多的編碼方式,Reader類怎麼能盡知你的文件使用的是哪一個,即便它都知道,也不可能有能力處理這么多的編碼方式啊。所以它不管對錯,只認一種——默認編碼方式,負責選擇正確的編碼方式,那是軟體開發者和這個文件使用者的責任。

『玖』 java程序亂碼和伺服器上操作系統的編碼有關系嗎

這個路操作系統也有關系,如果沒有指定編碼,java 程序就會取系統的編碼,建議設置成UTF-8編碼。
兩種在代碼中解決亂碼的方法:
1.servlet中doGet方法:
String name = request.getParameter("name");
String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"utf-8");

2.使用過濾器解決亂碼問題
在工程中新建Fliter過濾器文件
在doFliter方法中寫入如下代碼:
HttpServletRequest req = (HttpServletRequest)request;

3.在開發工具eclipse文件編碼設置:
1. 點擊windows。
2. 在列表最下點擊reference。
3. 在reference界面點擊Workspace
4. 在右邊的Tex file encoding點擊Other。
5. 選擇對應編碼即可。
6. 建議使用UTF-8編碼。

閱讀全文

與java系統編碼相關的資料

熱點內容
怎麼查找雲伺服器上的ftp 瀏覽:154
我的世界伺服器如何注冊賬號 瀏覽:932
統計英文字元python 瀏覽:423
linux信息安全 瀏覽:908
壓縮機接線柱爆 瀏覽:999
程序員自主創業 瀏覽:584
匯編程序員待遇 瀏覽:359
怎麼批量有順序的命名文件夾 瀏覽:211
杭州程序員健身 瀏覽:19
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143