String.getBytes(charsetName),這個方法很多人都用過,可是有沒有試過temp.getBytes("Unicode");這樣的用法,它的傳回值很奇怪,第1和第2個位元組是-1或-2,比如下面的代碼,你能想象出它的結果嗎?
String temp = "a";
try {
byte[] unicodes = temp.getBytes("Unicode");
System.out.println("unicodes=" + unicodes.length);
for (int i = 0; i < unicodes.length; i++) {
System.out.println(unicodes[i]);
}
unicodes = temp.getBytes("UnicodeLittleUnmarked");
System.out.println("unicodes=" + unicodes.length);
for (int i = 0; i < unicodes.length; i++) {
System.out.println(unicodes[i]);
}
unicodes = temp.getBytes("UnicodeBigUnmarked");
System.out.println("unicodes=" + unicodes.length);
for (int i = 0; i < unicodes.length; i++) {
System.out.println(unicodes[i]);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
輸出結果:
unicodes=4
-1
-2
97
0
unicodes=2
97
0
unicodes=2
0
97
為什麼會有這種結果呢?藍色的返回了四個位元組,-1,-2,是位元組順的一種表示,這是由sun的類庫實現,指示如果沒有指定位元組就使用預設的UnicodeLittle(在Window平台,別的平台我沒測試),但為了標識這種位元組順,就使用了-1,-2在前面表示。
黑色的字,是UnicodeLittleUnmarked的結果,其返回位元組只是兩個位元組,這與Unicode的編碼相符合,注意到97,0與使用Unicode時後兩個位元組順序一樣。
紅色的字,是使用UnicodeBigUnmarked的結果,位元組順與Little相反,也沒有-1,-2.
由以上應該知道,temp.getBytes("Unicode");應該小心使用,應該注意它返回的-1,-2,這兩
個位元組,因為在一些網路程式中,特別是當對方是由java以外的語言編寫,有可能不會使用這種方式來標識位元組順,因此要瞭解對方的細節,這樣才能保證資料
的準確傳遞。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
想把一個檔案中的日文部分提取出來,可是其他的東西都不知道是什麼,好在還能查到SHIFT-JIS編碼的範圍。有個範圍怎麼著還是能將就是把文字提出來,只是沒有格式罷了。轉自:http://blog.csdn.net/walacewang/archive/2006/03/03/614382.aspx
Shift_JIS是一個日本電腦系統常用的編碼錶。它能容納全形及半形拉丁字母、平假名、片假名、符號及日語漢字。
它被命名為Shift_JIS的原因,是它在放置全形字元時,要避開原本在0xA1-0xDF放置的半形假名字元。
在微軟及IBM的日語電腦系統中,即使用了這個編碼錶。這個編碼錶稱為CP932。
位元組結構
以下字元在Shift_JIS使用一個位元組來表示。
ASCII字元 (0×20-0×7E),但”\”被\\”¥”取代
ASCII控制字元 (0×00-0×1F、0×7F)
JIS X 0201標準內的半形標點及片假名(0xA1-0xDF)
在部分作業系統中,0xA0用來放置”不換行空格\\”。
以下字元在Shift_JIS使用兩個位元組來表示。
JIS X 0208字集的所有字元
“第一位位元組\\”使用0×81-0×9F、0xE0-0xEF (共47個)
“第二位位元組\\”使用0×40-0×7E、0×80-0xFC (共188個)
使用者定義區
“第一位位元組\\”使用0xF0-0xFC (共47個)
“第二位位元組\\”使用0×40-0×7E、0×80-0xFC (共188個)
在Shift_JIS編碼錶中,並未使用0xFD、0xFE及0xFF。
在微軟及IBM的日語電腦系統中,在0xFA、0xFB及0xFC的兩位元組地區,加入了388個JIS X 0208沒有收錄的符號和漢字。