全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2158
推到 Plurk!
推到 Facebook!

內碼轉換的代碼

答題得分者是:qoo1234
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-07 08:42:32 IP:222.135.xxx.xxx 未訂閱
 
各位先進,我是一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-07 13:44:06 IP:220.131.xxx.xxx 未訂閱
引言: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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-07 16:35:37 IP:222.135.xxx.xxx 未訂閱
雖然如此可是還不能結帖,上面還有很多問題沒有得到解答!請先進們繼續解答一下
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-07 22:01:09 IP:220.131.xxx.xxx 未訂閱
引言:
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;
 
http://myweb.hinet.net/home2/roc/cinput/big5.txt 網海無涯,唯學是岸!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-07 22:05:12 IP:220.131.xxx.xxx 未訂閱
引言:
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;
 
國標編碼就是中華人民共和國資訊交換 ... 規定將漢字字元分為87個區, 每個區有94個漢字(94位),因此共制定了87x94=8178個漢字、字元。 請自己查簡體中文配置方式 網海無涯,唯學是岸!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-07 22:28:31 IP:220.131.xxx.xxx 未訂閱
引言:
//這下麵是幹什麼用的?
  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”是一樣的,有什麼作用? 
參考BIG5碼編碼表..GB請參考簡體編碼表 簡單BIG5碼編碼表程式測試範例:
 
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-08 09:54:56 IP:222.135.xxx.xxx 未訂閱
哇,感謝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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-08 10:08:56 IP:220.131.xxx.xxx 未訂閱
Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161); 處理中文編碼偏移位置        網海無涯,唯學是岸!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-08 10:10:05 IP:220.131.xxx.xxx 未訂閱
Result := Chr(Hi(value)) + Chr(Lo(Value)); 中文分為高位元組與低位元組..    網海無涯,唯學是岸!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-08 10:11:26 IP:220.131.xxx.xxx 未訂閱
其他指令應用,請參考 http://www.delphibasics.co.uk/index.html    網海無涯,唯學是岸!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-08 10:14:01 IP:220.131.xxx.xxx 未訂閱
我要擴充卻失的字元,要如何添加代碼?    沒有測試過文字擴充,但請由中文編碼表中,自行修改測試看看    網海無涯,唯學是岸!
系統時間:2024-04-24 4:28:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!