String.getBytes(Unicode)的疑问 以及 SHIFT-JIS编码范围
String.getBytes(charsetName),這個方法很多人都用過,可是有沒有試過temp.getBytes("Unicode");這樣的用法,它的返回值很奇怪,第1和第2個字節(jié)是-1或-2,比如下面的代碼,你能想象出它的結(jié)果嗎??????
????????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();
??????? }
輸出結(jié)果:
unicodes=4
-1
-2
97
0
unicodes=2
97
0
unicodes=2
0
97
為什么會有這種結(jié)果呢?藍(lán)色的返回了四個字節(jié),-1,-2,是字節(jié)順的一種表示,這是由sun的類庫實(shí)現(xiàn),指示如果沒有指定字節(jié)就使用默認(rèn)的UnicodeLittle(在Window平臺,別的平臺我沒測試),但為了標(biāo)識這種字節(jié)順,就使用了-1,-2在前面表示。
黑色的字,是UnicodeLittleUnmarked的結(jié)果,其返回字節(jié)只是兩個字節(jié),這與Unicode的編碼相符合,注意到97,0與使用Unicode時(shí)后兩個字節(jié)順序一樣。
紅色的字,是使用UnicodeBigUnmarked的結(jié)果,字節(jié)順與Little相反,也沒有-1,-2.
由以上應(yīng)該知道,temp.getBytes("Unicode");應(yīng)該小心使用,應(yīng)該注意它返回的-1,-2,這兩 個字節(jié),因?yàn)樵谝恍┚W(wǎng)絡(luò)程序中,特別是當(dāng)對方是由java以外的語言編寫,有可能不會使用這種方式來標(biāo)識字節(jié)順,因此要了解對方的細(xì)節(jié),這樣才能保證數(shù)據(jù) 的準(zhǔn)確傳遞。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
想把一個文件中的日文部分提取出來,可是其他的東西都不知道是什么,好在還能查到SHIFT-JIS編碼的范圍。有個范圍怎么著還是能將就是把文字提出來,只是沒有格式罷了。轉(zhuǎn)自:http://blog.csdn.net/walacewang/archive/2006/03/03/614382.aspx
Shift_JIS是一個日本電腦系統(tǒng)常用的編碼表。它能容納全形及半形拉丁字母、平假名、片假名、符號及日語漢字。
它被命名為Shift_JIS的原因,是它在放置全形字符時(shí),要避開原本在0xA1-0xDF放置的半角假名字符。
在微軟及IBM的日語電腦系統(tǒng)中,即使用了這個編碼表。這個編碼表稱為CP932。
字節(jié)結(jié)構(gòu)
以下字元在Shift_JIS使用一個字節(jié)來表示。
ASCII字符 (0×20-0×7E),但”\”被\\”¥”取代
ASCII控制字符 (0×00-0×1F、0×7F)
JIS X 0201標(biāo)準(zhǔn)內(nèi)的半角標(biāo)點(diǎn)及片假名(0xA1-0xDF)
在部分操作系統(tǒng)中,0xA0用來放置”不換行空格\\”。
以下字元在Shift_JIS使用兩個字節(jié)來表示。
JIS X 0208字集的所有字符
“第一位字節(jié)\\”使用0×81-0×9F、0xE0-0xEF (共47個)
“第二位字節(jié)\\”使用0×40-0×7E、0×80-0xFC (共188個)
使用者定義區(qū)
“第一位字節(jié)\\”使用0xF0-0xFC (共47個)
“第二位字節(jié)\\”使用0×40-0×7E、0×80-0xFC (共188個)
在Shift_JIS編碼表中,并未使用0xFD、0xFE及0xFF。
在微軟及IBM的日語電腦系統(tǒng)中,在0xFA、0xFB及0xFC的兩字節(jié)區(qū)域,加入了388個JIS X 0208沒有收錄的符號和漢字。
總結(jié)
以上是生活随笔為你收集整理的String.getBytes(Unicode)的疑问 以及 SHIFT-JIS编码范围的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整理了二个基本的css库(高手请绕道)
- 下一篇: 本机获取Intel AMT IP地址的例