//*編程:編寫(xiě)一個(gè)截取字符串的函數(shù),輸入為一個(gè)字符串和字節(jié)數(shù),
輸出為按字節(jié)截取的字符串。 但是要保證漢字不被截半個(gè),
如“我ABC”4,應(yīng)該截為“我AB”,輸入“我ABC漢DEF”,6,應(yīng)該輸出為“我ABC”而不是“我ABC+漢的半個(gè)”。
*/
class SplitString
{
private String str;
private int byteNum;
public SplitString(){}
public SplitString(String str,int byteNum)
{
this.str=str;
this.byteNum=byteNum;
}
public void splitIt()
{
byte bt[]=str.getBytes();
System.out.println("Length of this String ===>"+bt.length);
if(byteNum>1)
{
if(bt[byteNum]<0)
{
pBinInt("bt[byteNum]",bt[byteNum]);
System.out.println("bt["+byteNum+"] = "+bt[byteNum]);//1
System.out.println("bt["+byteNum+"] = "+(int)bt[byteNum]);//2
System.out.println("bt["+byteNum+"] = "+(bt[byteNum]&0x000000FF));//3
System.out.println("bt["+byteNum+"] = "+(bt[byteNum+1]&0XFF));//4
String substrx=new String(bt,0,--byteNum);
System.out.println(substrx);
}
else
{
String substrex=new String(bt,0,byteNum);
System.out.println(substrex);
}
}
else
{
if(byteNum==1)
{
if(bt[byteNum]<0)
{
String substr1=new String(bt,0,++byteNum);
System.out.println(substr1);
}
else
{
String subStr2=new String(bt,0,byteNum);
System.out.println(subStr2);
}
}
else
{
System.out.println("輸入錯(cuò)誤!??!請(qǐng)輸入大于零的整數(shù):");
}
}
}
static void pBinInt(String s, int i) {
System.out.println(
s + ", int: " + i + ", binary: ");
System.out.print(" ");
for(int j = 31; j >=0; j--)
if(((1 << j) & i) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
}
class TestSplitString
{
public static void main(String args[])
{
String str="我ABCe啊DEFe";
int num=6;
SplitString sptstr = new SplitString(str,num);
sptstr.splitIt();
}
}
/*大致思路是:每個(gè)漢字對(duì)應(yīng)兩個(gè)字節(jié),而每個(gè)字節(jié)的首位都是1,這樣對(duì)應(yīng)的就是一個(gè)負(fù)數(shù).
當(dāng)然,這樣做其實(shí)也不是很?chē)?yán)密,具體原因就這里不作詳細(xì)討論
*/
/*
結(jié)果分析:
'啊'對(duì)應(yīng)的是區(qū)號(hào)是16位,位號(hào)是1,這樣計(jì)算:
3處的輸出為176,在JAVA中對(duì)應(yīng)的二進(jìn)制0X000000B0
最后一個(gè)字節(jié)有用,即10110000對(duì)應(yīng)的區(qū)號(hào)是176-128-32 =16,
減去128是因?yàn)槊總€(gè)字節(jié)的第一位總是1,后面7位(即2的七次方)才有用
減去32是因?yàn)镚B2312規(guī)定
同理,4處的輸出為161,對(duì)應(yīng)的是位號(hào),161-128-32=1
1,2處的都為為-80(字節(jié)轉(zhuǎn)化為整數(shù))
因?yàn)?0110000變?yōu)檎麛?shù)是變成0xFFFFFFB0,是一個(gè)負(fù)數(shù)的補(bǔ)碼,對(duì)應(yīng)的原碼是0x80000050,這個(gè)負(fù)數(shù)即是-80
值得一提的是為了求代表'啊'的整數(shù),(16+128+32)*256+(1+128+32),在excel中用char函數(shù):
如char((16 +128+32)*256+(1 +128+32))即可得到'啊'
*/
/*
參考文獻(xiàn):
漢字的編碼和表示
1)漢字交換碼(國(guó)標(biāo)碼) 漢字交換碼(國(guó)標(biāo)碼)主要用于漢字信息交換。
國(guó)標(biāo)碼:以國(guó)家標(biāo)準(zhǔn)局1980年頒布的《信息交換用漢字編碼字符集"基本集》(代號(hào)為GB2312 80)規(guī)定的漢字交換碼作為國(guó)家標(biāo)準(zhǔn)漢字編碼。 GB2312 80中共有7445個(gè)字符符號(hào): 漢字符號(hào)6763個(gè) 一級(jí)漢字3755個(gè)(按漢語(yǔ)拼音字母順序排列) 二級(jí)漢字3008個(gè)(按部首筆劃順序排列) 非漢字符號(hào)682個(gè) GB2312 80規(guī)定,所有的國(guó)標(biāo)碼漢字及符號(hào)組成一個(gè)94 94的方陣。在此方陣中,每一行稱(chēng)為一個(gè)"區(qū)",每一列稱(chēng)為一個(gè)"位"。這個(gè)方陣實(shí)際上組成一個(gè)有94個(gè)區(qū)(編號(hào)由01到94),每個(gè)區(qū)有94個(gè)位(編號(hào)由01到94)的漢字字符集。 一個(gè)漢字所在的區(qū)號(hào)和位號(hào)的組合就構(gòu)成了該漢字的"區(qū)位碼"。其中,高兩位為區(qū)號(hào),低兩位為位號(hào)。這樣區(qū)位碼可以唯一地確定某一漢字或字符;反之,任何一個(gè)漢字或符號(hào)都對(duì)應(yīng)一個(gè)唯一的區(qū)位碼,沒(méi)有重碼。
區(qū)位碼分布情況如下:
區(qū) 號(hào) 內(nèi) 容 1區(qū) 鍵盤(pán)上沒(méi)有的各種符號(hào) 2區(qū) 各種序號(hào) 3區(qū) 鍵盤(pán)上的各種符號(hào)(按中文方式給出) 4 -5區(qū) 日文字母 6區(qū) 希臘字母 7區(qū) 俄文字母 8區(qū) 標(biāo)識(shí)拼音聲調(diào)的母音及拼音字母名稱(chēng) 9區(qū) 制表符號(hào) 10- 15區(qū) 未用 16-55區(qū) 一級(jí)漢字(按拼音字母順序排列) 56- 87區(qū) 二級(jí)漢字(按部首筆劃順序排列) 88- 94區(qū) 自定義漢字
由上可以看出,所有漢字與符號(hào)的94個(gè)區(qū),可以分為四個(gè)組:
①1 -15區(qū):為圖形符號(hào)區(qū)。其中1 9區(qū)為標(biāo)準(zhǔn)符號(hào)區(qū);10 15區(qū)為自定義符號(hào)區(qū)。
②16 -55區(qū):為一級(jí)漢字區(qū),包含3755個(gè)漢字。這些區(qū)中的漢字按漢語(yǔ)拼音順序排序,同音字按筆畫(huà)順序列出。
③56 -87區(qū):為二級(jí)漢字區(qū),包含3008個(gè)漢字。這些區(qū)中的漢字是按部首筆劃順序排序的。
④88 -94區(qū):為自定義漢字區(qū)。
國(guó)標(biāo)碼規(guī)定,每個(gè)漢字(包括非漢字的一些符號(hào))由2字節(jié)代碼表示。每個(gè)字節(jié)的最高位為0,只使用低7位,而低7位的編碼中又有34個(gè)適用于控制用的,這樣每個(gè)字節(jié)只有27 - 34 = 94個(gè)編碼用于漢字。2個(gè)字節(jié)就有94 94=8836個(gè)漢字編碼。在表示一個(gè)漢字的2個(gè)字節(jié)中,高字節(jié)對(duì)應(yīng)編碼表中的行號(hào),稱(chēng)為區(qū)號(hào);低字節(jié)對(duì)應(yīng)編碼表中的列號(hào),稱(chēng)為位號(hào)。
漢字國(guó)標(biāo)碼的范圍用二進(jìn)制表示是: 00100001 00100001 01111110 01111110 (1+32)10 (1+32)10 (94+32)10 (94+32)10 7位ASCII碼是128個(gè)字符組成的字符集。其中編碼值0 31(00000000 00011111)不對(duì)應(yīng)任何印刷字符,通常稱(chēng)為控制符,用于計(jì)算機(jī)通信中的通信控制或?qū)τ?jì)算機(jī)設(shè)備的功能控制。編碼值32(00100000)是空格字符SP。編碼值127(1111111)是刪除字符DEL。
漢字國(guó)標(biāo)碼的起始二進(jìn)制位置選擇00100001即(33)10是為了跳過(guò)ASCII碼的32個(gè)控制字符和空格字符。所以,漢字國(guó)標(biāo)碼的高位和低位分別比對(duì)應(yīng)的區(qū)位碼大(32)10或(00100000)2或(20)H,即: 國(guó)標(biāo)碼高位 = 區(qū)碼 + 20H (H表示十六進(jìn)制) 國(guó)標(biāo)碼低位 = 位碼 + 20H
2) 漢字機(jī)內(nèi)碼(內(nèi)碼)(漢字存儲(chǔ)碼)
漢字機(jī)內(nèi)碼(內(nèi)碼)(漢字存儲(chǔ)碼)的作用是統(tǒng)一了各種不同的漢字輸入碼在計(jì)算機(jī)內(nèi)部的表示。 為了將漢字的各種輸入碼在計(jì)算機(jī)內(nèi)部統(tǒng)一起來(lái),就有了專(zhuān)用于計(jì)算機(jī)內(nèi)部存儲(chǔ)漢字使用的漢字機(jī)內(nèi)碼,用以將輸入時(shí)使用的多種漢字輸入碼統(tǒng)一轉(zhuǎn)換成漢字機(jī)內(nèi)碼進(jìn)行存儲(chǔ),以方便機(jī)內(nèi)的漢字處理 漢字機(jī)內(nèi)碼是在計(jì)算機(jī)內(nèi)部存儲(chǔ)、處理的代碼。計(jì)算機(jī)既要處理漢字,又要處理英文。因此計(jì)算機(jī)必須能區(qū)別漢字字符和英文字符。英文字符的的機(jī)內(nèi)碼是最高為為0的8位ASCII碼。為了不與7位ASCII碼發(fā)生沖突,把國(guó)標(biāo)碼每個(gè)字節(jié)的最高位由0改為1,其余位不變的編碼作為漢字字符的機(jī)內(nèi)碼。
漢字機(jī)內(nèi)碼的范圍用二進(jìn)制表示是: 10100001 10100001 11111110 11111110 機(jī)內(nèi)碼的高位和低位比對(duì)應(yīng)的國(guó)標(biāo)碼的高位和低位大(128)10或(10000000)2或(80)H 即: 機(jī)內(nèi)碼高位 = 國(guó)標(biāo)碼高位 + 80H 機(jī)內(nèi)碼低位 = 國(guó)標(biāo)碼低位 + 80H 又因?yàn)椋?國(guó)標(biāo)碼高位 = 區(qū)碼 + 20H 國(guó)標(biāo)碼低位 = 位碼 + 20H 所以: 機(jī)內(nèi)碼高位 = 區(qū)碼 + A0H 機(jī)內(nèi)碼低位 = 位碼 + A0H 也就是說(shuō),機(jī)內(nèi)碼高位和機(jī)內(nèi)碼低位分別比對(duì)應(yīng)的區(qū)碼和位碼大(160)10或(10100000)2或(A0)H 例如:漢字"啊"的區(qū)位碼為"1601",其中區(qū)碼為(16)10或(10)H,位碼為(01)10或(01)H。 則: 機(jī)內(nèi)碼高位 = 10H + A0H = B0H 機(jī)內(nèi)碼低位 = 01H + A0H = A1H 所以: 機(jī)內(nèi)碼= B0A1H
3) 漢字輸入碼(外碼)
漢字輸入碼(外碼)是為了通過(guò)鍵盤(pán)字符把漢字輸入計(jì)算機(jī)而設(shè)計(jì)的一種編碼。 英文輸入時(shí),相輸入什么字符便按什么鍵,輸入碼和機(jī)內(nèi)碼一致。漢字輸入時(shí),可能要按幾個(gè)鍵才能輸入一個(gè)漢字。 漢字輸入方案有成百上千個(gè),但是這千差萬(wàn)別的外碼輸入進(jìn)計(jì)算機(jī)后都會(huì)轉(zhuǎn)換成統(tǒng)一的內(nèi)碼。 漢字輸入方案大致可分為以下4種類(lèi)型:
(1) 音碼:如全拼、雙拼、微軟拼音等
(2) 形碼:如五筆字型、鄭碼、表形碼等
(3) 音形碼:如智能ABC、自然碼等
(4) 數(shù)字碼:如區(qū)位碼、電報(bào)碼等
4) 漢字字形碼(輸出碼)
漢字字形碼(輸出碼)用于漢字的顯示和打印,是漢字字形的數(shù)字化信息。 漢字的內(nèi)碼是用數(shù)字代碼來(lái)表示漢字,但是為了在輸出時(shí)讓人們看到漢字,就必須輸出漢字的字形。在漢字系統(tǒng)中,一般采用點(diǎn)陣來(lái)表示字形。 16 *16漢字點(diǎn)陣示意 16 * 16點(diǎn)陣字形的字要使用32個(gè)字節(jié)(16 * 16/8=32)存儲(chǔ),24 * 24點(diǎn)陣字形的字要使用72個(gè)字節(jié)(24 * 24/8=72)存儲(chǔ)。
一般來(lái)說(shuō),表現(xiàn)漢字時(shí)使用的點(diǎn)陣越大,則漢字字形的質(zhì)量也越好,當(dāng)然每個(gè)漢字點(diǎn)陣所需的存儲(chǔ)量也越大。
5) 漢字地址碼
漢字地址碼是指漢字庫(kù)(這里主要指整字形的點(diǎn)陣式字模庫(kù))中存儲(chǔ)漢字字形信息的邏輯地址。在漢字庫(kù)中,字形信息都是按一定順序(大多數(shù)按標(biāo)準(zhǔn)漢字交換碼中漢字的排列順序)連續(xù)存放在存儲(chǔ)介質(zhì)上的,所以漢字地址碼也大多是連續(xù)有序的,而且與漢字內(nèi)碼間有著簡(jiǎn)單的對(duì)應(yīng)關(guān)系,以簡(jiǎn)化漢字內(nèi)碼到漢字地址碼的轉(zhuǎn)換。
*/