內碼轉換的代碼 |
答題得分者是:qoo1234
|
jean2004
初階會員 發表:69 回覆:80 積分:39 註冊:2004-12-18 發送簡訊給我 |
各位先進,我是一個Delphi的初學者,利用業餘時間學習編程,至今沒有寫過一個像樣的Delphi軟體,但是還在努力中 最近看到一個內碼轉換的代碼,功能還可以,但是有部分字元無法正確轉換,我希望通過把它完善成為一個能正確轉換所有字元的控制項來提高自己的技術,但是有很多代碼看不懂,特向各位先進請教一下,請各位先進不吝賜教;代碼如下,注釋部分就是我的問題: unit CVCode; interface function GBtoBIG5(value: string): string; function BIG5toGB(value: string): string; implementation var BIG5Order: array[0..14757] of Word;//這裏是作什麼用的? GBOrder : array[0..8177] of Word; function GBOffset(value: string): integer; begin if length(value) >= 2 then//這裏那? Result := (Ord(value[1]) - 161) * 94 (Ord(value[2]) - 161) else Result := -1; end; function BIG5Offset(value: string): integer; begin Result := -1; if length(value) >= 2 then//下面的是什麼原理? begin if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then Result := (Ord(value[1]) - 161) * 157 (Ord(value[2]) - 64); if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then Result := (Ord(value[1]) - 161) * 157 63 (Ord(value[2]) - 161); end end; function WordToString(value: Word): string; begin Result := Chr(Hi(value)) Chr(Lo(Value)); end; function isBIG5(value: string): Boolean; begin if (length(value)>=2) then begin if (value[1] < #161) then Result := false else if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then Result := true else Result := false end else Result := false end; function isGB(value: string): Boolean; begin if (length(value)>=2) then begin if (value[1] <= #161) and (value[1] >= #247) then Result := false else if (value[2] <= #161) and (value[2] >= #254) then Result := false else Result := true end else Result := true; end; function GBtoBIG5(value: string): string; var leng, idx : integer; tmpStr : string[2]; Offset : integer; output : string; begin output := ''; leng := length(value); idx := 1; while idx <= leng do begin tmpStr := value[idx] value[idx 1]; if isGB(tmpStr) then begin offset:=GBOffset(tmpStr); if (offset >= 0) and (offset <= 8177) then begin output := output WordToString(GBOrder[offset]); inc(idx); end else output := output value[idx] ; end else output := output value[idx] ; inc(idx, 1); end; Result := output; end; function BIG5toGB(value: string): string; var leng, idx : integer; tmpStr : string[2]; output : string; offset : integer; begin output := ''; leng := length(value); idx := 1; while idx <= leng do begin tmpStr := value[idx] value[idx 1]; if isBIG5(tmpStr) then begin offset:=BIG5Offset(tmpStr); if (offset >= 0) and (offset <= 14757) then begin output := output WordToString(BIG5Order[offset]); inc(idx); end else output := output value[idx]; end else output := output value[idx]; inc(idx); end; Result := output; end; initialization //這下麵是幹什麼用的? BIG5Order[0] := $2020; BIG5Order[1] := $A3AC; BIG5Order[2] := $A1A2; BIG5Order[3] := $A1A3; …… BIG5Order[14753] := $2020; BIG5Order[14754] := $2020; BIG5Order[14755] := $2020; BIG5Order[14756] := $2020; BIG5Order[14757] := $2020;//這些“$2020”是一樣的,有什麼作用? GBOrder[0] := $2020; GBOrder[1] := $A142; …… GBOrder[8175] := $ECB8; GBOrder[8176] := $C24D; GBOrder[8177] := $2020; GBOrder[8177] := $2020;//結束的部分長度和上面的不一樣,為什麼? end. //如果我要把缺失的字元擴充上去,要如何操作? |
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言:BIG5Order: array[0..14757] of Word;//這裏是作什麼用的?Big5 是在 CCCII 不為政府單位採納, 國家頒布的中文標準碼又不堪用的情況下, 在民國 73 年,由台北市電腦公會 主導,聯合了十三家業者, 共同制定,又稱為 Big5_1984 (包括 5401 個常用字、7652 個次常用字、以及 441 個各式符號)。 Big5 的字符空間是個非連續的 94x157 矩陣,其容量為 14,758 位。 網海無涯,唯學是岸! 發表人 - qoo1234 於 2005/10/07 13:45:26 |
jean2004
初階會員 發表:69 回覆:80 積分:39 註冊:2004-12-18 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言:http://myweb.hinet.net/home2/roc/cinput/big5.txt 網海無涯,唯學是岸!function BIG5Offset(value: string): integer; begin Result := -1; if length(value) >= 2 then//下面的是什麼原理? begin if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then Result := (Ord(value[1]) - 161) * 157 (Ord(value[2]) - 64); if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then Result := (Ord(value[1]) - 161) * 157 63 (Ord(value[2]) - 161); end end; |
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言:國標編碼就是中華人民共和國資訊交換 ... 規定將漢字字元分為87個區, 每個區有94個漢字(94位),因此共制定了87x94=8178個漢字、字元。 請自己查簡體中文配置方式 網海無涯,唯學是岸!function GBOffset(value: string): integer; begin if length(value) >= 2 then//這裏那? Result := (Ord(value[1]) - 161) * 94 (Ord(value[2]) - 161) else Result := -1; end; |
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言:參考BIG5碼編碼表..GB請參考簡體編碼表 簡單BIG5碼編碼表程式測試範例://這下麵是幹什麼用的? BIG5Order[0] := $2020; BIG5Order[1] := $A3AC; BIG5Order[2] := $A1A2; BIG5Order[3] := $A1A3; …… BIG5Order[14753] := $2020; BIG5Order[14754] := $2020; BIG5Order[14755] := $2020; BIG5Order[14756] := $2020; BIG5Order[14757] := $2020;//這些“$2020”是一樣的,有什麼作用? function WordToString(value: Word): string; begin Result := Chr(Hi(value)) Chr(Lo(Value)); end; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text :=WordToString($2020) //表示空白 WordToString($D2C1) //畛 WordToString($CFC8) //珂 WordToString($A6A2) //弛 WordToString($A6B0) //旭 WordToString($A6B6); //朱 end;網海無涯,唯學是岸! 發表人 - qoo1234 於 2005/10/07 22:30:40 |
jean2004
初階會員 發表:69 回覆:80 積分:39 註冊:2004-12-18 發送簡訊給我 |
哇,感謝qoo1234先進,學到不少知識,再問最後一個問題就可以結貼了,就是:
Result := (Ord(value[1]) - 161) * 94 (Ord(value[2]) - 161);//作什麼用的?
Result := Chr(Hi(value)) Chr(Lo(Value));//作什麼用的?
是什麼意思?尤其是那個“Ord”和“WordToString”我在網上搜到了,但是不能理解其作用到底是什麼? 另外,我要擴充卻失的字元,要如何添加代碼? 發表人 - jean2004 於 2005/10/08 09:57:14
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |