我正在将一个D2006程序转换为D2010。我的数据库中存储了一个单字节的字符字符串的值,我需要将其加载到一个具有LoadFromStream方法的控件中,所以我的计划是将该字符串写入流并将其与LoadFromStream一起使用。 但是它没有起作用。在研究这个问题时,我发现一个问题告诉我,我并不真正理解如何从AnsiString转换为Unicode字符串。以下是一个独立的代码片段,说明了我感到困惑的问题:;
procedure TForm1.Button1Click(Sender: TObject); {$O-}
var
sBuffer: String;
oStringStream: TStringStream;
sAnsiString: AnsiString;
sUnicodeString: String;
iSize1,
iSize2: Word;
begin
sAnsiString := '12345';
oStringStream := TStringStream.Create(sBuffer);
sUnicodeString := sAnsiString;
iSize1 := StringElementSize(sAnsiString);
iSize2 := StringElementSize(sUnicodeString);
oStringStream.WriteString(sUnicodeString);
end;
如果您在最后一行打断点,并检查oStringStream的Bytes属性,您会看到它长这样:
Bytes (49 {$31}, 50 {$32}, 51 {$33}, 52 {$34}, 53 {$35}
我原本期望它可能看起来像这样:
(49 {$31}, 00 {$00}, 50 {$32}, 00 {$00}, 51 {$33}, 00 {$00},
52 {$34}, 00 {$00}, 53 {$35}, 00 {$00} ...
显然我的期望是错误的。但是,如何将AnsiString转换为Unicode?
我使用LoadFromStream时没有得到正确的结果,因为它每次从流中读取两个字节,但接收到的数据并不是这样排列的。我应该怎么做才能给LoadFromStream提供基于Unicode字符串的格式良好的数据流呢?
谢谢您的帮助。
sUnicodeString := sAnsiString
将字符串的有效载荷更正为Char=WideChar,因此对AnsiString调用StringElementSize将始终返回SizeOf(AnsiChar),对UnicodeString则返回SizeOf(Char)。SizeOf(AnsiChar)/SizeOf(Char)也更快、更易于阅读和理解,写起来也更短。 - Andreas Hausladen