紀念經典的 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