① java是如何編碼解碼的
[java]view plain
Stringname="Iam小明";
toHex(name.toCharArray());
<spanstyle="font-size:18px;white-space:pre;"></span><prename="code"class="java">try{
byte[]iso8859=name.getBytes("ISO-8859-1");
[java]view plain
toHex(iso8859);
[java]view plain
byte[]gb2312=name.getBytes("GB2312");
[java]view plain
toHex(gb2312);
[java]view plain
byte[]gbk=name.getBytes("GBK");
[java]view plain
toHex(gbk);
[java]view plain
}
[java]view plain
Stringstr="小米";
byte[]b=str.getBytes("UTF-8");
[java]view plain
publicbyte[]getBytes(StringcharsetName)
{
if(charsetName==null)thrownewNullPointerException();
returnStringCoding.encode(charsetName,value,0,value.length);
}
[java]view plain
staticbyte[]encode(StringcharsetName,char[]ca,intoff,intlen)
{
StringEncoderse=deref(encoder);
Stringcsn=(charsetName==null)?"ISO-8859-1":charsetName;
if((se==null)||!(csn.equals(se.requestedCharsetName())
||csn.equals(se.charsetName()))){
se=null;
try{
Charsetcs=lookupCharset(csn);//生成字元集實例
if(cs!=null)
se=newStringEncoder(cs,csn);
}catch(IllegalCharsetNameExceptionx){}
if(se==null)
(csn);
set(encoder,se);
}
returnse.encode(ca,off,len);
}
[java]view plain
(Stringcsn){
if(Charset.isSupported(csn)){
try{
returnCharset.forName(csn);
}catch(UnsupportedCharsetExceptionx){
thrownewError(x);
}
}
returnnull;
}
[java]view plain
privateStringEncoder(Charsetcs,Stringrcn){
this.requestedCharsetName=rcn;
this.cs=cs;
this.ce=cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
this.isTrusted=(cs.getClass().getClassLoader0()==null);
}
② JAVA 編碼 這是什麼編碼
編碼就是對已有的數據進行安全重編譯,比如說對於一個String字元串應用MD5加密 就會出現這種情況,比如字元串123456應用MD5加密編碼就會變成gdyb21LQTcIANtvYMT7QVQ== 還有時候是為了程序前端和後端保持一致的對字元串的處理方式,因為同一個字元串,一旦前、後端處理編碼不一致就會出現亂碼,就會把漢子變成亂碼輸出。像你想把手機號編碼成這種亂碼 ,最好就是應用MD5加密
③ java中文亂碼
主要是編碼差異,PrintWriter甚至整個Java IO默認會以UTF-8編碼輸出
你的網頁編碼必須設為UTF-8才能正確顯示其中的中文。
或者向PrintWriter傳入其他編碼的OutputStream,比如win默認的gbk編碼。
或者使用DataOutputStream靈活寫各種形式的數據。
④ Java編碼問題。
s1隻是棧內存里的一個變數,是個地址,它指向你new出來的變數,存放在堆內存里,是gb2312的
⑤ Java中如何設置編碼格式
打開Eclipse,選擇Window--〉Preferences--〉General---〉Workspace,然後在右邊的界面就可以看見Other選項,選擇即可設置編碼格式。
⑥ Java中的字元使用什麼編碼
System.out.println(Charset.defaultCharset()); 字元編碼(英語:Character encoding)也稱字集碼,是把字元集中的字元編碼為指定集合中某一對象(例如:比特模式、自然數序列、8位組或者電脈沖),以便文本在計算機中存儲和通過通信網路的傳遞...
⑦ java中編碼與解碼分別指什麼
java中編碼:URLEncoder.encode(strUri,"utf-8");
java中解碼碼:URLDecoder.decode(strUri,"utf-8");
⑧ 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幾種常見的編碼格式
ASCII 碼
學過計算機的人都知道 ASCII 碼,總共有 128 個,用一個位元組的低 7 位表示,0~31 是控制字元如換行回車刪除等;32~126 是列印字元,可以通過鍵盤輸入並且能夠顯示出來。
ISO-8859-1
128 個字元顯然是不夠用的,於是 ISO 組織在 ASCII 碼基礎上又制定了一些列標准用來擴展 ASCII 編碼,它們是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵蓋了大多數西歐語言字元,所有應用的最廣泛。ISO-8859-1 仍然是單位元組編碼,它總共能表示 256 個字元。
GB2312
它的全稱是《信息交換用漢字編碼字元集 基本集》,它是雙位元組編碼,總的編碼范圍是 A1-F7,其中從 A1-A9 是符號區,總共包含 682 個符號,從 B0-F7 是漢字區,包含 6763 個漢字。
GBK
全稱叫《漢字內碼擴展規范》,是國家技術監督局為 windows95 所制定的新的漢字內碼規范,它的出現是為了擴展 GB2312,加入更多的漢字,它的編碼范圍是 8140~FEFE(去掉 XX7F)總共有 23940 個碼位,它能表示 21003 個漢字,它的編碼是和 GB2312 兼容的,也就是說用 GB2312 編碼的漢字可以用 GBK 來解碼,並且不會有亂碼。
GB18030
全稱是《信息交換用漢字編碼字元集》,是我國的強制標准,它可能是單位元組、雙位元組或者四位元組編碼,它的編碼與 GB2312 編碼兼容,這個雖然是國家標准,但是實際應用系統中使用的並不廣泛。
UTF-16
說到 UTF 必須要提到 Unicode(Universal Code 統一碼),ISO 試圖想創建一個全新的超語言字典,世界上所有的語言都可以通過這本字典來相互翻譯。可想而知這個字典是多麼的復雜,關於 Unicode 的詳細規范可以參考相應文檔。Unicode 是 Java 和 XML 的基礎,下面詳細介紹 Unicode 在計算機中的存儲形式。
UTF-16 具體定義了 Unicode 字元在計算機中存取方法。UTF-16 用兩個位元組來表示 Unicode 轉化格式,這個是定長的表示方法,不論什麼字元都可以用兩個位元組表示,兩個位元組是 16 個 bit,所以叫 UTF-16。UTF-16 表示字元非常方便,每兩個位元組表示一個字元,這個在字元串操作時就大大簡化了操作,這也是 Java 以 UTF-16 作為內存的字元存儲格式的一個很重要的原因。
UTF-8
UTF-16 統一採用兩個位元組表示一個字元,雖然在表示上非常簡單方便,但是也有其缺點,有很大一部分字元用一個位元組就可以表示的現在要兩個位元組表示,存儲空間放大了一倍,在現在的網路帶寬還非常有限的今天,這樣會增大網路傳輸的流量,而且也沒必要。而 UTF-8 採用了一種變長技術,每個編碼區域有不同的字碼長度。不同類型的字元可以是由 1~6 個位元組組成。
UTF-8 有以下編碼規則:
如果一個位元組,最高位(第 8 位)為 0,表示這是一個 ASCII 字元(00 - 7F)。可見,所有 ASCII 編碼已經是 UTF-8 了。
如果一個位元組,以 11 開頭,連續的 1 的個數暗示這個字元的位元組數,例如:110xxxxx 代表它是雙位元組 UTF-8 字元的首位元組。
如果一個位元組,以 10 開始,表示它不是首位元組,需要向前查找才能得到當前字元的首位元組
Java 中需要編碼的場景
前面描述了常見的幾種編碼格式,下面將介紹 Java 中如何處理對編碼的支持,什麼場合中需要編碼。
I/O 操作中存在的編碼
我們知道涉及到編碼的地方一般都在字元到位元組或者位元組到字元的轉換上,而需要這種轉換的場景主要是在 I/O 的時候,這個 I/O 包括磁碟 I/O 和網路 I/O,關於網路 I/O 部分在後面將主要以 Web 應用為例介紹。