最近在做Delphi 转C#的工作:需要把原来用Delphi写的程序转到C#上。由是想到自己写个程序来转转。
但是Delphi窗体里汉字使用的是#NNNNN格式的Unicode编码,图片存储的是(XXXXXXX)格式的内容。
上网参照一个“UniCode2Chinese”的函数在Delphi里能实现转换。通过分析这个函数结合PHP代码进行测试发现在最后一步WideCharToString转换前PHP和Delphi的处理结果都是类似的(Delphi里前后两个ASCII进行了颠倒)。然后查看Delphi手册:WideCharToString converts the given null-terminated Unicode string to a string made up of single- or multi-byte characters.。然后想到可能是文字的编码不对,经过测试发现,原来Delphi里的Unicode使用是utf-16的编码。最终PHP的代码如下:
mb_convert_encoding(hex2bin(dechex("35775")), 'gbk', 'utf-16') 其中35775为DFM文件中以#号开头的5个数字,表示的一个汉字。
DFM中的图片起初怀疑它是base64编码经测试不对。又怀疑它是16进制的编码,但只使用hex2bin转完后写到文件里并不能显示图片。经过比对转完后的内容和原始图片发现转后的内容多了一些数据---多了图片的格式信息,即Delphi控件属性中Picture属性栏里显示的内容。可惜一直没有找到分割的完美办法,因为多出的内容和文件类型有关,开始测试了几个发现都以0000结束但后来发现也有以0100结束的。所以便没继续研究。