本文目錄一覽:
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();
}
這個代碼輸出如下,為防止百度或者說你的電腦未安裝支持冷僻字的字體,不能正確顯示冷僻字,這裡面用圖片啦。
Java語言所使用的字符集是什麼?
java
中用的是Unicode字符集
包含$美元符號
絕大部分漢字一個字元佔兩個位元組
,所以漢字
在Java中也可以當做變數
,但一般都不這麼用
,很容易出錯
Java中字符集有哪些呢???
字符集(character set)是一個系統支持的所有抽象字元的集合。字元(character)就是各種文字和符號,包括國家文字、標點符號、圖形符號、數字等。
如果僅僅是抽象的字符集,其實是顧名思義的,但是我們常說的字符集,其實是指編碼字符集(coded character set),比如: Unicode、ASCII、GB2312、GBK等等。什麼是編碼字符集呢?編碼字符集是指,這個字符集里的每一個字元,都對應到唯一的一個代碼值,這些代碼值叫做代碼點(code point),可以看做是這個字元在編碼字符集里的序號,字元在給定的編碼方式下的二進位比特序列稱為代碼單元(code unit)。在Unicode字符集中,字母A對應的數值是十六進位下的0041,書寫時前面加U+,所以Unicode里A的代碼點是U+0041。
常見的編碼字符集有:
Unicode:也叫統一字符集,它包含了幾乎世界上所有的已經發現且需要使用的字元(如中文、日文、英文、德文等)。
ASCII:早期的計算機系統只能處理英文,所以ASCII也就成為了計算機的預設字符集,包含了英文所需要的所有字元。
GB2312:中文字符集,包含ASCII字符集。ASCII部分用單位元組表示,剩餘部分用雙位元組表示。
GBK:GB2312的擴展,完整包含了GB2312的所有內容。
GB18030:GBK字符集的超集,常叫大漢字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韓三國語言中的所有字元。
學習相關java類知識,推薦來北京尚學堂,優秀的師資和科學的授課方式,會帶給你完美的學習體驗。
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[]與原來的數組不一致。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/312985.html