程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 中文轉碼器的工作原理

中文轉碼器的工作原理

編輯:Delphi

  最近在做Delphi下的簡體與繁體轉換, 發現Windows2000自帶的工具"中文轉碼器"很好用, 不僅可以轉內碼(BIG5-->GBK), 還可以將繁體字轉為簡體字(如:東-->東).

  要轉內碼比較簡單, 使用MultiByteToWideChar先將簡體/繁體(GBK/BIG5)轉為UniCode, 再使用WideCharToMultiByte從Unicode轉為繁體/簡體(BIG5/GBK).

EX:
function Big52GB( ABig5String: string): String;
{ BIG5 to GBK : BIG5 ==> Unicode ==> GBK }
Var
  mWString: array[0..1024] of WideChar;
  cchWideChar: Integer;
  mLongBool: LongBool;
begin
  Result := ABig5String;    //分配空間
  mLongBool := True;
  //1.先取得需要的長度
  cchWideChar := MultiByteToWideChar(950, 0, PChar(ABig5String), length(ABig5String), @mWString, 0);
//  SetLength(mWString, cchWideChar+1);
  //2.BIG5 to Unicode
  MultiByteToWideChar(950, 0, PChar(ABig5String), length(ABig5String), @mWString, cchWideChar);
  //3.Unicode to GBK
  WideCharToMultiByte(936, 0, @mWString, cchWideChar, PChar(Result), length(Result), '?', @mLongBool);
end;

  經過以上步驟, 就可以把BIG5碼轉為GBK碼,但是繁體中的字因為在GBK中大部分都有對應(繁體字形),因而,以上得到的是BIG5對應的繁體字形,如BIG5碼的 “東”($AA46)得到的GBK對應的字為“東”($967C),而不是簡體中最常用的“東”($B6AB)。

   在中文轉碼器中,最後一頁提供了是否轉字形的選項,它可以做到!那我們也應該可以做到!經過調試,原來它是調用LCMapStringW!

  在Windows.pas中,定義了三個這樣的函數:

  function LCMapString(Locale: LCID; dwMapFlags: DWord; lpSrcStr: PChar;
    cchSrc: Integer; lpDestStr: PChar; cchDest: Integer): Integer; stdcall;

  function LCMapStringA(Locale: LCID; dwMapFlags: DWord; lpSrcStr: PAnsiChar;
    cchSrc: Integer; lpDestStr: PAnsiChar; cchDest: Integer): Integer; stdcall;

  function LCMapStringW(Locale: LCID; dwMapFlags: DWord; lpSrcStr: PWideChar;
    cchSrc: Integer; lpDestStr: PWideChar; cchDest: Integer): Integer; stdcall;

  其中,LCMapString=LCMapStringA,也就是使用ASCII的,當然我們也可以使用LCMapStringW轉UniCode成為簡體字形。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved