1. 程式人生 > >紀念經典的 D7(Delphi 7編碼轉換程式)

紀念經典的 D7(Delphi 7編碼轉換程式)

很喜歡Delphi 7,以前一直用它寫好多有趣的程式,雖然不是專業程式設計師。

但我很奇怪的是,大家沒寫一些公用的單元,一起大家交流的,大概覺得寫得挺好的程式碼,幾乎都是Google抄的,國內的百度幾乎程式碼不好用,也許是國內優秀程式設計師不屑把優秀程式碼貼出來的吧。

為紀念D7,我單獨寫了一個單元,D7EncodedText.pas,他用的簡單的原理實現Unicode,Gb2312,UTF32之間的轉換。主要是將各種格式的string當位元組使用,在各種格式之間轉換就容易得多的,這思路,查了下,外國的比較多,而國內的少。

最近,更新了些功能,可以將16進位制資料直接存為bin檔案(點右鍵之類的出來),以便可以直接將看見的HexStr存為資料,例如RichEdit中顯示的0x65存為到bin檔案後,UltraEdit開啟,16進位制觀察就是65。

下載地址(新更新了下,含其他一些有趣函式,新增加1個老外匯編寫的單元FReplace.pas,以取代delphi自帶的StringReplace太慢的問題,需採用FastReplace函式):

在D7EncodedText.pas中的主要函式,其中好幾個函式還是借鑑老外的程式碼,的確很優秀,不過還是請大家有空幫我改改UTF32- >Ansistring(CoderToUtf32Str函式),我的方法只是臨時解決的方案,雖然我的不報錯但不正規;若最後不設定長度,很容易記憶體洩露,多點幾次會報錯,原因不明

  function  UnicodeSave(const FileName:string;WS:widestring):boolean;
  function  UnicodeRead(const FileName:string):WideString;

  function  UnicodeBigSave(const FileName:string;WS:widestring):boolean;
  function  UnicodeBigRead(const FileName:string):WideString;
  
  function  UTF8Save(const FileName:string;WS:widestring):boolean;
  function  UTF8Read(const FileName:string):WideString;


  function  AnsiSave(const FileName:string;WS:widestring):boolean;
  function  AnsiRead(const FileName:string):WideString;


  function GetTextType(const FileName: string): String;   //返回文字格式資訊


  function TextRead(const FileName:string):FReadText; //讀取各種格式
  function TextSave(const FileName:string;WS:widestring):boolean;  //儲存原格式


  function UnicodeEncode(Str:string;CodePage:integer):WideString;  //unicode編碼
  function UnicodeDecode(Str:WideString;CodePage:integer):string;  //unicode解碼


  function WStrToStr(const ws: WideString; codePage: Word): AnsiString; //寬字串轉單字串,等同於UnicodeEncode
  function StrToWStr(const s: AnsiString; codePage: Word): WideString;  //單字串轉寬字串,等同於UnicodeDecode
//  function WideStringToUCS4String(const ws : WideString) : UCS4String;


  function HexToInt(s: string): Integer;    //IntToHex函式,D7自帶;實際應該寫為HexStrToInt
  function IntToBinStr(i: integer): string;  //integer範圍signed 32-bit
  function ByteToHexStr(AByte : Byte ) : string;    //單位元組處理
  function HexStrToByte(HexS: String ) : Byte;     //2位16進位制字串轉為1個位元組
  function HexStrToDec(HexStr: AnsiString):AnsiString; //按每2位Hex字元轉換為3位十進位制數字字串


  //以下是連續字元和位元組的處理
  function BytesOf(const Val: AnsiString): TBytes;                        //Ansistring字串的位元組陣列形式
  function HexStrToBytes(const HexStr: AnsiString): TBytes;               //連續的16進位制數的位元組陣列形式
  function BytesToHexStr(ABytes: TBytes; len: Integer): AnsiString;       //位元組陣列的 Ansistring字串形式


  //機內碼 轉 Ansi(GB2312)字元,中文系統下:16進位制/無空格分隔 ;   分隔字串當然不能是0..9,A..F,a..f
  function CoderToAnsiStr(HexS: String;const Delimited:string=''):String;
  function CoderToUTF8Str(HexS: String;const Delimited:string=''):String;  //機內碼 轉 Utf-8
  function CoderToUnicodeStr(HexS: String;const Delimited:string=''):String;   //機內碼 轉 unicode字元:預設16進位制/無空格分隔
  function CoderToUnicodeBigEndianStr(HexS: String;const Delimited:string=''):String;   //機內碼 轉 unicodeBigEndian
  function CoderToUtf32Str(HexS: String;const Delimited:string=''):String;              //機內碼 轉 Utf-32
  function CoderToUtf32BigEndianStr(HexS: String;const Delimited:string=''):String;    //機內碼 轉 Utf-32 BigEndian


  function UTF8StrToCoder(S:String; const Delimited:string=''):string;        //Utf-8 轉 機內碼
  function AnsiStrToCoder(S: String;const Delimited:string=''):String;        //Ansi(包括GB2312,準確是當前的字符集)字元轉機內碼
  function UniCodeStrToCoder(S:String;const Delimited:string=''):String;             //unicode字元轉機內碼
  function UniCodeBigEndianStrToCoder(S:String; const Delimited:string=''):string;   //unicodeBigEndian字元轉機內碼
  function UTF32StrToCoder(S:String; const Delimited:string=''):string;          //  Utf-32 轉 機內碼
  function UTF32BigEndianStrToCoder(S:String; const Delimited:string=''):string; //Utf-32 BigEndian 轉 機內碼


  function  BinFileToHexStr(BinFileName:string):string;                         //按2進位制檔案讀取檔案為HexStr字串(包括Bin檔案)
  function  HexStrToBinFile(HexStr:string;BinFileName:string):Boolean;          //HexStr存為2進位制檔案



21:25 2014-10-10