很喜欢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