我目前正在花一些时间来转换我的网络单元来支持unicode字符串,到目前为止事情进展顺利(至少我认为是这样)。不幸的是我正在使用 Delphi 7 ,所以我无法测试unicode支持,我没有更新的Delphi版本的文档。
我在代码中使用了一些TReader和TWriter对象来使用ReadString和WriteString方法来传输字符串。在D7上,他们使用的String类型等于 AnsiString 。如果我理解正确,在D2009 / D2010中String类型等于 UnicodeString 。那么当使用D2009 / D2010中的ReadString和WriteString方法时,有没有人知道TReader和TWriter 是否自动以UnicodeString格式流式传输字符串,还是我需要更改某些内容?
答案 0 :(得分:4)
是。 TReader和TWriter支持Unicde。事实上,vcl / rtl中只有一部分不支持Unicode:旧式Read(Ln)和Write(Ln)文件访问方法,它们也用于直接从控制台读取和写入。
是的,字符串是D2009 +中的UnicodeString。 PChar是D2009 +的PWideChar。 因此,如果您坚持使用标准类型,您的代码将正常移植。
只有在假设一个字符等于一个字节的情况下编写代码时,才会遇到麻烦。
更新:
白皮书Delphi和Unicode,作者:Marco Cantu:http://edn.embarcadero.com/article/38980
Cary Jensen将旧版应用迁移到支持Unicode的Delphi 2010:http://edn.embarcadero.com/article/40472
新白皮书:由Cary Jensen撰写的Delphi Unicode迁移仅限于真人:http://edn.embarcadero.com/article/40307
答案 1 :(得分:2)
我刚看了一下我的Delphi 2010安装,TWriter有以下几种方法:
procedure WriteStr(const Value: AnsiString);
procedure WriteUTF8Str(const Value: string);
procedure WriteString(const Value: UnicodeString);
procedure WriteWideString(const Value: UnicodeString);
TReader有相同的方法。所以WriteStr(和ReadStr)将与AnsiStrings一起使用以实现向后兼容,WriteString和WriteWideString将unicode字符串写为unicode,而WriteUTF8Str接受unicode字符串并将其写为UTF8。 (如果您使用ANSI字符集,这可以节省大量空间。)