本文目錄一覽:
Java語言所使用的字符集是什麼?
Java語言所使用的字符集是16位Unicode編碼。另外再介紹一些常見的字符集:\x0d\x0a\x0d\x0a1、最早在dos下寫pascal的時候,就遇到ASCII字符集,後來還是dos下寫c,也是ascii字符集\x0d\x0a特點:目前最通用的單字節編碼字符集\x0d\x0a表示:單字節\x0d\x0a最早ascii用7bit表示,總共能表示2^7=128個字符,後來擴展到8bit,就表示2^8=256個字符\x0d\x0a2、GB2312又稱為GB2312-80字符集,全稱為《信息交換用漢字編碼字符集·基本集》,由原中國國家標準總局發布,1981年5月1日實施。\x0d\x0a特點:當然是能表示99%的中國漢字,還包括拉丁字母、日文假名、希臘字母、俄文字母、漢語拼音符號、漢語注音字母等\x0d\x0a表示:雙字節\x0d\x0a3、GBK是漢字編碼標準之一,全稱《漢字內碼擴展規範》,GBK 向下與GB2312編碼兼容,向上支持ISO10646.1國際標準。可以認為GBK是在GB2313基礎上通過內碼擴展出來的一個標準。\x0d\x0a特點:完全兼容GB2312標準,支持國際標準ISO/IEC10646-1和國家標準GB13000-1中的全部中日韓漢字,並包含了BIG5編碼中的所有漢字\x0d\x0a表示:雙字節\x0d\x0a4、Big5,台灣那邊使用比較多。\x0d\x0a5、GB 18030,全稱是GB18030-2000《信息交換用漢字編碼字符集基本集的擴充》,是我國政府於2000年3月17日發布的新的漢字編碼國家標準,2001年8月31日後在中國市場上發布的軟件必須符合本標準。\x0d\x0a特點:就是強大。覆蓋中文、日文、朝鮮語和中國少數民族文字。滿足中國大陸、香港、台灣、日本和韓國等東亞地區信息交換多文種、大字量、多用途、統一編碼格式的要求。並且與Unicode 3.0版本兼容,填補Unicode擴展字符字彙“統一漢字擴展A”的內容。並且與以前的國家字符編碼標準(GB2312,GB13000.1)兼容。\x0d\x0a表示:單字節、雙字節、四字節三種方式\x0d\x0a6、Unicode野心更大(當然有一個國際統一標準當然是好事)\x0d\x0a特點:Unicode是一種在計算機上使用的字符編碼。它為每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。\x0d\x0a表示:utf-8,utf-16,utf-32\x0d\x0a這裡可能有點不好理解,舉個例子\x0d\x0a首先,把unicode理解成對所有字符做了一個統一的編號,比如:“字”這個字符,編號是23383,這個是unicode定義的\x0d\x0a但是,在計算機中,如何存儲這個編號呢?方式就有很多,存儲unicode的方式,就是utf-8,utf-16,utf-32\x0d\x0a23383數值的16進制表示:0x5b57\x0d\x0autf-8用3個字節來表示漢字,所以utf-8的表示為:0xE5AD97\x0d\x0autf-16用2個字節來表示漢字,所以utf-16的表示為:0x5b57 剛好和數值是一樣的\x0d\x0autf-32用4個字節來表示漢字,所以utf-32的表示為:0x00005b57 和數值是一樣的,不過浪費空間\x0d\x0a7、再來講講utf-8,它是一種變長的字符集\x0d\x0a表示:單字節來表示字母,雙字節來表示一些希臘字母,三字節來表示漢字,當然也有四字節的\x0d\x0a這麼做當然會增加表示和識別的難度,不過,可以節省空間。這也是為什麼utf-8在網絡編碼中流行的原因。\x0d\x0a
java以二進制傳輸字符集填啥
用UTF-8.
java讀寫文件的有很多種方式,基本都是採用java.io的inputStream和各種基於inputstream的封裝實現對文件的讀寫,最原始的接口提供的便是基於byte的讀寫,而String可以看做是char[],一個char是8個byte。在最原始的ASCII編碼中,我們採用一個字節 也就時8位來表示一個字符(圖形字符或者控制字符),而後來1個字節不足以表示現實中的所有字符,於是出現了各種各樣的編碼格式,常見的比如UTF-8,GBK,UNICODE等。java中的string也是遵循jre中定義的默認字符集(基本為UTF-8),而在byte[]轉化成String的過程中可能會由於編碼字符集問題導致String逆向回來的byte[]與原來的數組不一致。
java中字符集什麼意思
Java 中字符串在內核中使用 Unicode,也就是說每個字符 JVM 只記錄它的 Unicode Code Point,只有在網絡傳輸或保存到磁盤上時才需要把它轉換成特定的字符集的編碼,這個字符集就是把一個 Unicode Code Point 整數翻譯成一串 byte[],因為在網絡或磁盤上,字節是一個一個排列的,我們需要知道把高位字節排前面還是排後面並且容易推斷出哪個哪個字節是一個字符的邊界,這樣才能把相關的幾個字節還原成一個字符而不是把第2個字符的後面半數字節和第3個字符的前面半數的字節拼在一起出一個怪異的字符,我們以前在早期的電腦遊戲中不支持雙字節漢語時我們經常碰到這個問題,那就是先輸入一個漢字,在內存中有2個字節,然後我們按一下 backspace 軟件只刪除一個字節,我們再輸入一個漢字之後一共有3個字節的,這時我們用一個支持漢字的軟件來查看這個文字可能是第1個剩下的字節和後面的字符的第1字節拼起來剛好又是另一個漢字,而剩下的第3個字節就不是有意義的繪圖符號。
當不需要把 JVM 內存中的字符傳輸到網絡外或磁盤上或打印出來的時候,我們是不需要知道字符集的,在顯示在圖形界面上時JVM知道怎麼把它們顯示出來,現在的 Windows 操作系統同樣也是 Unicode 內核的,也就是說我們只要說明 Unicode Code Point 它應該知道是什麼字符,那麼只剩下字體這邊是否也是用 Unicode Code Point 來對應一個字符啦(這個我不確定,但估計也是),如果操作系統和字符這邊也是按 Unicode Code Point 來對應,那麼當我們不保存到磁盤或發送出網絡時是完全不需要知道有字符集這回事的。
下面這個例子中處理一個 Unicode 6.0 新標準中收錄的漢字,你看到 UTF-8, UTF-16, GB18030 支持它們,但 GB2312 沒有收錄這個漢字,所以出個問號,也就是我們學說的亂碼啦。
什麼是 Unicode,下面這樣的表格就是 Unicode,而那些坐標數字就是 Code Point.
JDK 1.5 的 String 這個類支持 Unicode Code Point,也就是說能處理任何任意超出雙字節的字符的處理,它是一些學術研究者(比如考古,古文獻研究) 必須的功能,回想起來曾經的電報碼翻譯成電腦信息時由於輸入法和字符集沒有收錄這些字沒辦法通過“輸入一個數字得到這個字符的途徑”,大家都是先掃描一個用圖片再在電腦中剪切出每個字符的小圖片貼出來的。記得在漢字處理時如果碰到冷僻字時它會超出2個字節,用 charAt() 這個是會出錯的,因為 char 類型表示範圍在 0 – 255 之間(2個字節),不能直接保存冷僻字,需要用2個 char 來表示一個字,因此 substring 的位置全是錯誤的,我們需要 offsetByCodePoints 重新計算一次 index 才能正確地 substring。
public static void main(String[] args) throws IOException
{
int[] codePoints = new int[16];
for (int i = 0; i 16; i++)
{
codePoints[i] = 0x20020 + i;
}
String a = new String(codePoints, 0, codePoints.length);
System.out.println(“字符串:” + a);
System.out.println(“字符串換算成 char[] 存儲總長度是 :” + a.length());
System.out.println(“codePointAt(7) 索引換算成 charAt 索引 :” + a.offsetByCodePoints(1, 7));
String c = a.substring(a.offsetByCodePoints(1, 7), a.offsetByCodePoints(1, 8));
System.out.println(“UTF-8 for ” + c + ” is ” + toString(c.getBytes(“UTF-8″)) + ” == “
+ new String(c.getBytes(“UTF-8”), “UTF-8”));
System.out.println(“UTF-16 for ” + c + ” is ” + toString(c.getBytes(“UTF-16″)) + ” == “
+ new String(c.getBytes(“UTF-16”), “UTF-16”));
System.out.println(“GB2312 for ” + c + ” is ” + toString(c.getBytes(“GB2312″)) + ” == “
+ new String(c.getBytes(“GB2312”), “GB2312”));
System.out.println(“GB18030 for ” + c + ” is ” + toString(c.getBytes(“GB18030″)) + ” == “
+ new String(c.getBytes(“GB18030”), “GB18030”));
}
private static String toString(byte[] input)
{
StringBuffer b = new StringBuffer();
b.append(‘[‘);
for (int i = 0, size = input.length; i size; i++)
{
b.append(Integer.toString(input[i]));
if (i size – 1)
b.append(‘,’);
}
b.append(‘]’);
return b.toString();
}
這個代碼輸出如下,為防止百度或者說你的電腦未安裝支持冷僻字的字體,不能正確顯示冷僻字,這裡面用圖片啦。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/157586.html