gpt4 book ai didi

delphi - 将 AnsiString 转换为 Unicode 字符串

转载 作者:行者123 更新时间:2023-12-03 15:10:51 25 4
gpt4 key购买 nike

我正在将 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 字符串的格式良好的数据流?

感谢您的帮助。

最佳答案

oStringStream.WriteString 的参数类型是什么?如果它是 AnsiString,则您有从 Unicode 到 Ansi 的隐式转换,这解释了您的示例。

<小时/>

更新:现在真正的问题是 TStringStream 如何在内部存储数据。在下面的代码示例中(Delphi 2009)

procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
SS: TStringStream;

begin
S:= 'asdfg';
SS:= TStringStream.Create(S); // 1 byte per char
SS.WriteString('321');
Label1.Caption:= SS.DataString;
SS.Free;
end;

TStringStream 在内部使用默认系统 ANSI 编码(每个字符 1 个字节)。构造函数和 WriteString 过程将字符串参数从 unicode 转换为 ANSI。

要覆盖此行为,您必须在构造函数中显式声明编码:

procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
SS: TStringStream;

begin
S:= 'asdfg';
SS:= TStringStream.Create(S, TEncoding.Unicode); // 2 bytes per char
SS.WriteString('321');
Label1.Caption:= SS.DataString;
SS.Free;
end;

关于delphi - 将 AnsiString 转换为 Unicode 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2557358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com